国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】內(nèi)聯(lián)函數(shù)、auto關鍵字、基于范圍的for循環(huán)、指針空值nullptr

這篇具有很好參考價值的文章主要介紹了【C++】內(nèi)聯(lián)函數(shù)、auto關鍵字、基于范圍的for循環(huán)、指針空值nullptr。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【C++】內(nèi)聯(lián)函數(shù)、auto關鍵字、基于范圍的for循環(huán)、指針空值nullptr,C++,c++,開發(fā)語言,c語言,算法

??樊梓慕:個人主頁

???個人專欄:《C語言》《數(shù)據(jù)結構》《藍橋杯試題》《LeetCode刷題筆記》《實訓項目》《C++》

??每一個不曾起舞的日子,都是對生命的辜負


目錄

前言

1.內(nèi)聯(lián)函數(shù)

1.1概念

1.2特性

2.auto關鍵字

2.1類型別名思考

2.2auto簡介

2.3auto的使用細則

2.4auto不能使用的場景

3.基于范圍的for循環(huán)

3.1范圍for的用法

3.2范圍for的使用條件

4.指針空值nullptr


前言

本篇文章是進入類和對象學習的前一課,也是最后一些與大家交代的C++入門知識,大家可以收藏下方便記憶。


歡迎大家??收藏??以便未來做題時可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================文章來源地址http://www.zghlxwxcb.cn/news/detail-728461.html

GITEE相關代碼:??fanfei_c的倉庫??

=========================================================================


1.內(nèi)聯(lián)函數(shù)

1.1概念

inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時C++編譯器會在調用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)調用建立棧幀的開銷,內(nèi)聯(lián)函數(shù)提升程序運行的效率。

觀察一些普通函數(shù)的匯編代碼:

【C++】內(nèi)聯(lián)函數(shù)、auto關鍵字、基于范圍的for循環(huán)、指針空值nullptr,C++,c++,開發(fā)語言,c語言,算法

那我們學習過函數(shù)棧幀的同學肯定非常熟悉,這里去call到add的地址。

那內(nèi)聯(lián)函數(shù)存在的意義就是省略掉這個過程,給程序運行提速。

如果在上述函數(shù)前增加inline關鍵字將其改成內(nèi)聯(lián)函數(shù),在編譯期間編譯器會用函數(shù)體替換函數(shù)的調用。


??我們來看看如何查看這一過程??

查看方式:

  • 在release模式下,查看編譯器生成的匯編代碼中是否存在call Add。
  • 在debug模式下,需要對編譯器進行設置,否則不會展開(因為debug模式下,編譯器默認不會對代碼進行優(yōu)化,以下給出vs2013的設置方式)。

【C++】內(nèi)聯(lián)函數(shù)、auto關鍵字、基于范圍的for循環(huán)、指針空值nullptr,C++,c++,開發(fā)語言,c語言,算法

【C++】內(nèi)聯(lián)函數(shù)、auto關鍵字、基于范圍的for循環(huán)、指針空值nullptr,C++,c++,開發(fā)語言,c語言,算法


1.2特性

1. inline是一種以空間換時間的做法,如果編譯器將函數(shù)當成內(nèi)聯(lián)函數(shù)處理,在編譯階段,會用函數(shù)體替換函數(shù)調用,缺陷:可能會使目標文件變大,優(yōu)勢:少了調用開銷,提高程序運行效率。
2. inline對于編譯器而言只是一個建議,不同編譯器關于inline實現(xiàn)機制可能不同,一般建議:將函數(shù)規(guī)模較小(即函數(shù)不是很長,具體沒有準確的說法,取決于編譯器內(nèi)部實現(xiàn))、不是遞歸、頻繁調用的函數(shù)采用inline修飾,否則編譯器會忽略inline特性。


下圖為《C++prime》第五版關于inline的建議:

【C++】內(nèi)聯(lián)函數(shù)、auto關鍵字、基于范圍的for循環(huán)、指針空值nullptr,C++,c++,開發(fā)語言,c語言,算法


3. inline不建議聲明和定義分離,分離會導致鏈接錯誤。因為inline被展開,就沒有函數(shù)地址了,鏈接就會找不到。

比如:

// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
	cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
	f(10);
	return 0;
}
// 鏈接錯誤:main.obj : error LNK2019: 無法解析的外部符號 "void __cdecl f(int)" (?
//f@@YAXH@Z),該符號在函數(shù) _main 中被引用

??【面試題】??


宏的優(yōu)缺點?
優(yōu)點:
1.增強代碼的復用性。
2.提高性能。
缺點:
1.不方便調試宏。(因為預編譯階段進行了替換)
2.導致代碼可讀性差,可維護性差,容易誤用。
3.沒有類型安全的檢查 。


C++有哪些技術替代宏?
1. 常量定義 換用const enum
2. 短小函數(shù)定義 換用內(nèi)聯(lián)函數(shù)


2.auto關鍵字

2.1類型別名思考

隨著程序越來越復雜,程序中用到的類型也越來越復雜,經(jīng)常體現(xiàn)在:

  • 類型難于拼寫
  • 含義不明確導致容易出錯
#include <string>
#include <map>
int main()
{
	std::map<std::string, std::string> m{ { "apple", "蘋果" }, { "orange", "橙子" },
	{"pear","梨"} };
	std::map<std::string, std::string>::iterator it = m.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

std::map<std::string, std::string>::iterator 是一個類型,但是該類型太長了,特別容易寫錯。聰明的同學可能已經(jīng)想到:可以通過typedef給類型取別名,比如:

#include <string>
#include <map>
typedef std::map<std::string, std::string> Map;
int main()
{
	Map m{ { "apple", "蘋果" },{ "orange", "橙子" }, {"pear","梨"} };
	Map::iterator it = m.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

使用typedef給類型取別名確實可以簡化代碼,但是typedef有會遇到新的難題:

typedef char* pstring;
int main()
{
	const pstring p1; // 編譯成功還是失???
	const pstring* p2; // 編譯成功還是失???
	return 0;
}

?分析:

  • const pstring p1;:這行代碼定義了一個名為 p1 的常量指針,指向 char 類型的數(shù)據(jù)。這意味著 p1 是一個常量指針,指向的數(shù)據(jù)是不能修改的。編譯器會發(fā)出警告,因為 p1 是一個常量指針,但是沒有指定它指向的數(shù)據(jù)是一個常量。
  • const pstring* p2;:這行代碼定義了一個名為 p2 的指針,指向 pstring 類型的常量指針。這意味著 p2 是一個指向常量指針的指針。編譯器不會發(fā)出警告,因為 p2 是一個指針,只是指向 pstring 類型的常量指針。

需要注意的是,雖然編譯器可能會警告或報錯,但實際的編譯結果可能會因編譯器的不同而有所差異。這是由于不同的編譯器對于 const 修飾符的處理方式可能有所不同。

總之,根據(jù)代碼的定義和使用情況,編譯結果可能會有警告或錯誤,具體取決于編譯器的實現(xiàn)。建議在使用typedef時,確保定義和使用的一致性,并遵循編譯器的警告和錯誤提示。

即在編程時,常常需要把表達式的值賦值給變量,這就要求在聲明變量的時候清楚地知道表達式的類型。然而有時候要做到這點并非那么容易,因此C++11給auto賦予了新的含義。


2.2auto簡介

在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它,大家可思考下為什么?
C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。

int TestAuto()
{
	return 10;
}
int main()
{
	int a = 10;
	auto b = a;
	auto c = 'a';
	auto d = TestAuto();
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	//auto e; 無法通過編譯,使用auto定義變量時必須對其進行初始化
	return 0;
}

注意:使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據(jù)初始化表達式來推導auto的實際類型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為變量實際的類型。?


2.3auto的使用細則

1.auto與指針和引用結合起來使用
用auto聲明指針類型時,用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時則必須加&。

比如:

int main()
{
	int x = 10;
	auto a = &x;
	auto* b = &x;
	auto& c = x;
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	*a = 20;
	*b = 30;
	c = 40;
	return 0;
}

2.在同一行定義多個變量
當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進行推導,然后用推導出來的類型定義其他變量。
比如:

void TestAuto()
{
	auto a = 1, b = 2;
	auto c = 3, d = 4.0; // 該行代碼會編譯失敗,因為c和d的初始化表達式類型不同
}

2.4auto不能使用的場景

1.auto不能作為函數(shù)的參數(shù),返回值。

// 此處代碼編譯失敗,auto不能作為形參類型,因為編譯器無法對a的實際類型進行推導
void TestAuto(auto a)
{}

2. auto不能直接用來聲明數(shù)組。

void TestAuto()
{
    int a[] = {1,2,3};
    auto b[] = {4,5,6};
}

3. 為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法。
4. auto在實際中最常見的優(yōu)勢用法就是跟以后會講到的C++11提供的新式for循環(huán),還有l(wèi)ambda表達式等進行配合使用。

5.auto真正的意義:定義對象時,類型較長,用auto比較方便。


3.基于范圍的for循環(huán)

3.1范圍for的用法

在C++98中如果要遍歷一個數(shù)組,可以按照以下方式進行:

void TestFor()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
		array[i] *= 2;
	for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); ++p)
		cout << *p << endl;
}

對于一個有范圍的集合而言,由程序員來說明循環(huán)的范圍是多余的,有時候還會容易犯錯誤。

因此C++11中引入了基于范圍的for循環(huán)。

for循環(huán)后的括號由冒號“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍。?

void TestFor()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (auto& e : array)//想要修改數(shù)組中的值,加引用&,這里不能用指針!
		e *= 2;
    //依次取數(shù)組中數(shù)據(jù)賦給e,自動++,自動判斷結束
	for (auto e : array)//可用實際類型,但推薦使用auto
		cout << e << " ";
	return 0;
}

注意:與普通循環(huán)類似,可以用continue來結束本次循環(huán),也可以用break來跳出整個循環(huán)。?


3.2范圍for的使用條件

1.for循環(huán)迭代的范圍必須是確定
對于數(shù)組而言,就是數(shù)組中第一個元素和最后一個元素的范圍;對于類而言,應該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍。
注意:以下代碼就有問題,因為for的范圍不確定

void TestFor(int array[])//傳參得到數(shù)組首元素地址,不是數(shù)組!
{
	for (auto& e : array)//所以不確定范圍
		cout << e << endl;
}

2.迭代的對象要實現(xiàn)++和==的操作。(關于迭代器這個問題,以后會講,現(xiàn)在提一下,沒辦法講清楚,現(xiàn)在大家了解一下就可以了)?


4.指針空值nullptr

在良好的C/C++編程習慣中,聲明一個變量時最好給該變量一個合適的初始值,否則可能會出現(xiàn)不可預料的錯誤,比如未初始化的指針。如果一個指針沒有合法的指向,我們基本都是按照如下方式對其進行初始化:

void TestPtr()
{
	int* p1 = NULL;
	int* p2 = 0;
	// ……
}

NULL實際是一個宏,在傳統(tǒng)的C頭文件(stddef.h)中,可以看到如下代碼:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

可以看到,NULL可能被定義為字面常量0,或者被定義為無類型指針(void*)的常量。

不論采取何種定義,在使用空值的指針時,都不可避免的會遇到一些麻煩,比如:

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}
int main()
{
    //調用第一個函數(shù)
	f(0);
    //同樣調用第一個函數(shù),但此時就有歧義了,可能程序員想的是NULL此時為空指針
	f(NULL);//可能程序員像調用第二個函數(shù)就只能用下面的方法了
    //調用第二個函數(shù)
	f((int*)NULL);
	return 0;
}

在C++98中,字面常量0既可以是一個整形數(shù)字,也可以是無類型的指針(void*)常量,但是編譯器默認情況下將其看成是一個整形常量,如果要將其按照指針方式來使用,必須對其進行強轉(void *)0。

注意:

  • 在使用nullptr表示指針空值時,不需要包含頭文件,因為nullptr是C++11作為新關鍵字引入的。
  • 在C++11中,sizeof(nullptr) 與 sizeof((void*)0)所占的字節(jié)數(shù)相同。
  • 為了提高代碼的健壯性,在后續(xù)表示指針空值時建議最好使用nullptr。?

??馬上就進入類和對象的學習啦??


=========================================================================

如果你對該系列文章有興趣的話,歡迎持續(xù)關注博主動態(tài),博主會持續(xù)輸出優(yōu)質內(nèi)容

??博主很需要大家的支持,你的支持是我創(chuàng)作的不竭動力??

??~ 點贊收藏+關注 ~??

=========================================================================

到了這里,關于【C++】內(nèi)聯(lián)函數(shù)、auto關鍵字、基于范圍的for循環(huán)、指針空值nullptr的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關鍵字&范圍for循環(huán)&nullptr

    【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關鍵字&范圍for循環(huán)&nullptr

    ========================================================================= 個人主頁還有更多系列專欄: 小白不是程序媛 我的小倉庫: Gitee C++系列專欄: C++頭疼記 ========================================================================= 目錄 前言 引用 概念 引用的特點 常引用? 引用的使用場景 做參數(shù) ?做返

    2024年02月08日
    瀏覽(44)
  • 從C語言到C++(第一章_C++入門_下篇)內(nèi)聯(lián)函數(shù)+auto關鍵字(C++11)+范圍for +nullptr

    從C語言到C++(第一章_C++入門_下篇)內(nèi)聯(lián)函數(shù)+auto關鍵字(C++11)+范圍for +nullptr

    目錄 1. 內(nèi)聯(lián)函數(shù) 1.1 內(nèi)聯(lián)函數(shù)的概念 1.2 內(nèi)聯(lián)函數(shù)的特性 1.3 宏的優(yōu)缺點和替代方法 2. auto(C++11) 2.1 改版前的auto 2.2 C++11的auto 2.3 auto 的使用場景 2.4?使用auto的注意事項 3. 范圍 for(C++11) 3.1 范圍 for 的用法 3.2 范圍 for 的使用條件 4.?指針空值 nullptr 4.1 C++ 98 中的指針空

    2023年04月21日
    瀏覽(21)
  • 【C++入門】引用、內(nèi)聯(lián)函數(shù)、auto 關鍵字

    從語法上理解,引用就是給變量取一個 別名 ,它沒有獨立空間,和它引用的變量共用一塊空間。 例子: 值得注意的是,C++ 中的引用一經(jīng)初始化,后面是改變不了指向的(這點與Java有所不同),而且引用是必須初始化的。 引用的類型也必須和原變量對應,顯然,你肯定不能

    2024年02月16日
    瀏覽(14)
  • 【C++】引用、內(nèi)聯(lián)函數(shù)、auto關鍵字等

    【C++】引用、內(nèi)聯(lián)函數(shù)、auto關鍵字等

    前言:在前面我們講解了C++入門基礎的一些學習例如命名空間、缺省參數(shù)、函數(shù)重載等。今天我們將進一步的學習,跟著博主的腳步再次往前邁一步吧。 ?? 博主CSDN主頁:衛(wèi)衛(wèi)衛(wèi)的個人主頁 ?? ?? 專欄分類:高質量C++學習 ?? ??代碼倉庫:衛(wèi)衛(wèi)周大胖的學習日記?? ??關注博

    2024年02月20日
    瀏覽(95)
  • 【C++初階(三)】引用&內(nèi)聯(lián)函數(shù)&auto關鍵字

    【C++初階(三)】引用&內(nèi)聯(lián)函數(shù)&auto關鍵字

    目錄 ?前言 ?1. 引用 ? 1.1 引用的概念? ?1.2 引用的特性 ?1.3 引用的權限 ?1.4 引用的使用 ?1.5 引用與指針的區(qū)別 2. 內(nèi)聯(lián)函數(shù) 2.1? 什么是內(nèi)聯(lián)函數(shù) 2.2? 內(nèi)聯(lián)函數(shù)的特性 ?3. auto ?3.1 auto簡介 ?3.2 auto使用規(guī)則 ?3.3 auto不能使用的場景 4.? 基于范圍的for循環(huán) ?4.1 范圍for使用

    2024年02月08日
    瀏覽(36)
  • 【C++】C++入門第二課(函數(shù)重載 | 引用 | 內(nèi)聯(lián)函數(shù) | auto關鍵字 | 指針空值nullptr)

    【C++】C++入門第二課(函數(shù)重載 | 引用 | 內(nèi)聯(lián)函數(shù) | auto關鍵字 | 指針空值nullptr)

    目錄 前言 函數(shù)重載 概念 重載函數(shù)的條件 C++支持重載函數(shù)的原理--名字修飾 引用 概念 特性 常引用(const引用) 使用場景 傳值,傳引用效率比較 引用和指針的區(qū)別 內(nèi)聯(lián)函數(shù) 概念 特性 auto(C++11) auto簡介 auto的使用規(guī)則 指針空值nullptr(C++11) C++98中的指針空值 結語

    2024年04月15日
    瀏覽(21)
  • 【C++基礎】auto關鍵字(C++11)(auto的使用細則;auto不能推導的場景;auto的使用場景;基于范圍的for循環(huán))

    【C++基礎】auto關鍵字(C++11)(auto的使用細則;auto不能推導的場景;auto的使用場景;基于范圍的for循環(huán))

    在早期C/C++( C++98 )中auto的含義是:使用auto修飾的變量,是具有 自動存儲器的局部變量 ,但遺憾的是一直沒有人去使用它。因為在函數(shù)內(nèi)定義的變量默認就是局部變量。 C++11 中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的 類型指示

    2023年04月13日
    瀏覽(22)
  • 【C++】: auto關鍵字(C++11)+基于范圍的for循環(huán)(C++11)+指針空值nullptr(C++11)

    【C++】: auto關鍵字(C++11)+基于范圍的for循環(huán)(C++11)+指針空值nullptr(C++11)

    隨著程序越來越復雜,程序中用到的類型也越來越復雜,經(jīng)常體現(xiàn)在: 類型難于拼寫 含義不明確導致容易出錯 std::mapstd::string, std::string::iterator 是一個類型,但是該類型太長了,特別容 易寫錯。聰明的同學可能已經(jīng)想到:可以通過typedef給類型取別名,比如: 使用typedef給類

    2024年02月08日
    瀏覽(27)
  • 【C++入門必備知識:|引用| +|auto關鍵字| + |范圍for|】

    【C++入門必備知識:|引用| +|auto關鍵字| + |范圍for|】

    在這里插入圖片描述 引用不是新定義一個變量,而是給已經(jīng)存在的變量取別名,編譯器不會為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存區(qū)間。 比如水滸傳里的李逵 小名叫鐵牛,江湖人稱黑旋風。這些都是他,只不過名字不同。 類型 引用變量名=引用實體

    2023年04月22日
    瀏覽(23)
  • 【C++深入淺出】初識C++下篇(auto關鍵字、范圍for、nullptr指針)

    【C++深入淺出】初識C++下篇(auto關鍵字、范圍for、nullptr指針)

    目錄 一. 前言 二. auto 2.1 auto的引入 2.2 auto簡介 2.3 auto的使用細則 2.4?auto不能推導的場景 三. 基于范圍的for循環(huán)(C++11) 3.1 范圍for的語法 3.2 范圍for的原理 3.3 范圍for的使用條件 四. 指針空值nullptr(C++11) ? ? ? ? 上期我們介紹了c++新增的兩個重要語法:引用和內(nèi)聯(lián)函數(shù),今

    2024年02月11日
    瀏覽(114)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包