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

【C++】入門基礎(chǔ)知識詳解(二)

這篇具有很好參考價值的文章主要介紹了【C++】入門基礎(chǔ)知識詳解(二)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、內(nèi)聯(lián)函數(shù)

1、概念

2、特性

3、內(nèi)聯(lián)函數(shù)與宏的優(yōu)缺點

二、auto關(guān)鍵字(C++11)

? 1、auto 簡介

? 2、auto的使用細則

? ? 2.1?auto與指針和引用結(jié)合起來使用

? ? 2.2?在同一行定義多個變量

? 3、auto不能推導(dǎo)的場景

? ? 3.1 auto 不能作為函數(shù)的參數(shù)

? ? 3.2 auto 不能直接用來聲明數(shù)組

三、基于范圍for循環(huán)(C++11)

? 1、范圍for的語法

? 2、范圍for的使用條件

? ? 2.1?for循環(huán)迭代的范圍必須是確定的

四、指針空值nullptr(C++11)

? 1、C++98中的指針空值


一、內(nèi)聯(lián)函數(shù)

1、概念

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

【C++】入門基礎(chǔ)知識詳解(二)

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

1. 在 release 模式下,查看編譯器生成的匯編代碼中是否存在 call Add;

2. 在 debug 模式下,需要對編譯器進行設(shè)置,否則不會展開(因為 debug 模式下,編譯器默認(rèn)不 會對代碼進行優(yōu)化,以下給出 vs2013 的設(shè)置方式)

【C++】入門基礎(chǔ)知識詳解(二)

【C++】入門基礎(chǔ)知識詳解(二)

2、特性

  1. inline 是一種以空間換時間的做法,如果編譯器將函數(shù)當(dāng)成內(nèi)聯(lián)函數(shù)處理,在編譯階段,會用函數(shù)體替換函數(shù)調(diào)用,缺陷:可能會使目標(biāo)文件變大,優(yōu)勢:少了調(diào)用開銷,提高程序運行效率。
  2. inline 對于編譯器而言只是一個建議,不同編譯器關(guān)于 inline 實現(xiàn)機制可能不同,一般建 議:將函數(shù)規(guī)模較小(即函數(shù)不是很長,具體沒有準(zhǔn)確的說法,取決于編譯器內(nèi)部實現(xiàn))、不是遞歸、且頻繁調(diào)用的函數(shù)采用 inline 修飾,否則編譯器會忽略 inline 特性。
  3. inline 不建議聲明和定義分離,分離會導(dǎo)致鏈接錯誤。因為 inline 被展開,就沒有函數(shù)地址了,鏈接就會找不到。

3、內(nèi)聯(lián)函數(shù)與宏的優(yōu)缺點

? 內(nèi)聯(lián)函數(shù)和宏的區(qū)別在于:宏是由預(yù)處理器對宏進行替換的,而內(nèi)聯(lián)函數(shù)是通過編譯器控制實現(xiàn)的,宏是在預(yù)處理階段進行替換,內(nèi)聯(lián)函數(shù)是在編譯階展開的。而且內(nèi)聯(lián)函數(shù)是真正的函數(shù),只是在需要用到的時候內(nèi)聯(lián)函數(shù)像宏一樣的展開,所以取消了函數(shù)的參數(shù)壓棧,減少了調(diào)用的開銷。所以可以像調(diào)用函數(shù)一樣來調(diào)用內(nèi)聯(lián)函數(shù),而不必?fù)?dān)心會產(chǎn)生像宏出現(xiàn)的問題。

? 在c語言中,用宏(#define)寫函數(shù),會優(yōu)化,沒有棧幀的消耗,適合頻繁調(diào)用小函數(shù)。但是宏是有些缺陷的。C++中用內(nèi)聯(lián)函數(shù)、const修飾的常量、enum來代替宏.

C++中替換宏的辦法:

  1. 常量定義 換用const 、enum。
  2. 短小函數(shù)定義換用內(nèi)聯(lián)函數(shù)。

內(nèi)聯(lián)函數(shù)的優(yōu)缺點?

優(yōu)點:

  1. 因為內(nèi)聯(lián)函數(shù)是函數(shù),函數(shù)參數(shù)有類型,因此在編譯階段會進行參數(shù)類型檢測,安全性更高;
  2. 內(nèi)聯(lián)函數(shù)在編譯階段已經(jīng)展開,少了函數(shù)的調(diào)用,提高函數(shù)的運行效率;
  3. 內(nèi)聯(lián)函數(shù)不用像宏函數(shù)那樣到處加括號,實現(xiàn)起來更簡單;
  4. Debug模式下默認(rèn)不會展開,可以進行調(diào)試,也可以通過對編譯器設(shè)置來驗證到底是否展開;
  5. 不會有副作用。

缺點:

  1. 每個使用內(nèi)聯(lián)函數(shù)的位置幾乎都會被展開,會造成代碼膨脹。

宏的優(yōu)缺點?

(1) 宏常量的優(yōu)缺點

優(yōu)點:

  1. 一改全改,降低出錯概率,提高代碼的可讀性。

缺點:

  1. 在預(yù)處理節(jié)點進行替換,不會進行類型檢測,代碼安全性低。

(2) 宏函數(shù)的優(yōu)缺點

優(yōu)點:

  1. 不是函數(shù),少了函數(shù)調(diào)用的開銷,提高程序的運行效率;
  2. 可少些一些代碼,因為宏函數(shù)可以封裝多條語句;
  3. 可提高代碼的可讀性。

缺點:

  1. 宏函數(shù)預(yù)處理階段被替換,不會進行類型的檢測,代碼安全性低;
  2. 宏函數(shù)不能進行調(diào)試(因為在預(yù)編譯階段進行了替換);
  3. 容易出錯,宏函數(shù)的每一部分都需要加上括號;
  4. 每個宏函數(shù)的位置都會被展開,會造成代碼的膨脹;
  5. 宏函數(shù)可能會有副作用。

二、auto關(guān)鍵字(C++11)

? 1、auto 簡介

在早期 C/C++ 中 auto 的含義是:使用 auto 修飾的變量,是具有自動存儲器的局部變量,但遺憾的 是一直沒有人去使用它。 C++11 中,標(biāo)準(zhǔn)委員會賦予了 auto 全新的含義即:auto 不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導(dǎo)而得。

int TeTestAuto()
{
	return 10;
}
int main()
{
	int a = 10;
	auto b = a;//此時編譯器會根據(jù) a 的類型來對 b 的類型進行推導(dǎo)為 int
	auto c = 'a';
	auto d = TeTestAuto();
    auto e = &a;

	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
    cout << typeid(e).name() << endl;
    return 0;
}

?typeid(變量名).name()能打印變量的類型。

【C++】入門基礎(chǔ)知識詳解(二)

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

? 2、auto的使用細則

? ? 2.1?auto與指針和引用結(jié)合起來使用

用 auto 聲明指針類型時,用 auto 和 auto* 沒有任何區(qū)別,但用 auto 聲明引用類型時則必須 加&。

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;

? ? 2.2?在同一行定義多個變量

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

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

? 3、auto不能推導(dǎo)的場景

? ? 3.1 auto 不能作為函數(shù)的參數(shù)

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

? ? 3.2 auto 不能直接用來聲明數(shù)組

void TestAuto()
{
    int a[] = {1,2,3};
    auto b[] = {4,5,6}; //編譯會失敗
}

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

三、基于范圍for循環(huán)(C++11)

? 1、范圍for的語法

for 循環(huán)后的括號由冒號“ :”分為兩部分:第一部分是范 圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍。這樣的話在遍歷整個集合來說就不需要說明所循環(huán)的范圍。

void Test()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    for (auto& e : arr)//要改變數(shù)組的值,需要使用引用
        e *= 2;

    for (auto e : arr)
        cout << e << " ";
}

? 2、范圍for的使用條件

? ? 2.1?for循環(huán)迭代的范圍必須是確定的

對于數(shù)組而言,就是數(shù)組中第一個元素和最后一個元素的范圍;對于類而言,應(yīng)該提供 begin 和 end 的方法,begin 和 end 就是 for 循環(huán)迭代的范圍。

void TestFor(int array[])
{
    for(auto& e : array)
        cout<< e <<endl;
}

?注意:上面代碼就有問題,因為 for 的范圍不確定。

四、指針空值nullptr(C++11)

? 1、C++98中的指針空值

NULL可能被定義為字面常量0,或者被定義為無類型指針(void*)的常量。不論采取何種定義,在使用空值的指針時,都不可避免的會遇到一些麻煩。

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}
//這里函數(shù)重載,但結(jié)果都是f(int)
//C++中,NULL被定義為0,這也不知道為什么是個錯誤不太好
int main()
{
	f(0);
	f(NULL);
	return 0;
}

???程序本意是想通過 f(NULL) 調(diào)用指針版本的 f(int*) 函數(shù),但是由于 NULL 被定義成0,因此與程序的 初衷相悖。

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

? ?因此,C++11中打了一個補丁,用 nullptr 來代替 NULL 。

注意:

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

本文要是有不足的地方,歡迎大家在下面評論,我會在第一時間更正。

【C++】入門基礎(chǔ)知識詳解(二)文章來源地址http://www.zghlxwxcb.cn/news/detail-500245.html

?老鐵們,記著點贊加關(guān)注!!!???

到了這里,關(guān)于【C++】入門基礎(chǔ)知識詳解(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C++基礎(chǔ)知識 (命名空間、輸入輸出、函數(shù)的缺省參數(shù)、函數(shù)重載)

    C++基礎(chǔ)知識 (命名空間、輸入輸出、函數(shù)的缺省參數(shù)、函數(shù)重載)

    ?? 例1: #include iostream 標(biāo)準(zhǔn)輸入輸出 std 是 c++ 標(biāo)準(zhǔn)庫的命名空間,將標(biāo)準(zhǔn)庫的定義實現(xiàn)都放到這個命名空間中 using namespace std 展開 std 里的內(nèi)容 cout ? c 代表的是 console 控制臺的意思, out 有輸出的意思 流運算符 流插入 endl 等價于 \\\'n\\\' 在 c++ 中,變量、函數(shù)和類的名稱存在于

    2024年02月15日
    瀏覽(48)
  • c語言基礎(chǔ)知識幫助理解(詳解函數(shù))

    c語言基礎(chǔ)知識幫助理解(詳解函數(shù))

    目錄 1. 函數(shù)是什么 2. 庫函數(shù)? 3. 自定義函數(shù)? 4. 函數(shù)參數(shù)? 4.1實際參數(shù)(實參)? 4.2形式參數(shù)(形參)? 5.函數(shù)的調(diào)用 5.1傳值調(diào)用 5.2傳址調(diào)用 (傳遞地址) 6. 函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問? 6.1 嵌套調(diào)用? 6.2 鏈?zhǔn)皆L問? 7. 函數(shù)的聲明和定義? 7.1 函數(shù)聲明 ?7.2函數(shù)定義 函數(shù)是

    2024年02月14日
    瀏覽(24)
  • c語言基礎(chǔ)知識幫助理解(函數(shù)遞歸詳解)

    c語言基礎(chǔ)知識幫助理解(函數(shù)遞歸詳解)

    \\\"從前有座山,山里有座廟,廟里有個老和尚和一個小和尚。有一天老和尚對小和尚說:“從前有座山.山里有座廟,廟里有個老和尚和一個小和尚,有一天老和尚對小和尚說:“從前有座山.山里有座廟,廟里有個老和尚和一個小和尚......\\\" (雖能體現(xiàn)遞歸特點,但又不是遞歸)

    2024年02月14日
    瀏覽(29)
  • C++類和對象基礎(chǔ)知識詳解

    C++類和對象基礎(chǔ)知識詳解

    1.一切皆是對象。如下圖: ·女人是一個對象 ·鞋子是一個對象 ·包包是一個對象 ·衣服是一個對象 ·褲子是一個對象 ·手鏈?zhǔn)且粋€對象 … 這里人這個對象,由鞋子、包包、衣服、 褲子、手鏈等對象組成。 3.每個對象都有: a)數(shù)據(jù)(描述對象的屬性) b)函數(shù)(行為操作代碼

    2023年04月12日
    瀏覽(29)
  • 【C++從入門到精通】第2篇:C++基礎(chǔ)知識(中)

    本節(jié),我們將更多地討論在“Hello, World!”程序中使用的 std::cout 語句,將文本“Hello, World!”輸出到控制臺。我們還將探討如何從用戶獲取輸入,我們將使用這些使我們的程序更具交互性。 輸入/輸出庫 (io 庫)是處理基本輸入和輸出的C++標(biāo)準(zhǔn)庫的一部分。我們將使用此庫中的

    2024年02月07日
    瀏覽(48)
  • 【Linux系統(tǒng)基礎(chǔ)快速入門詳解】SSH遠程連接必備網(wǎng)絡(luò)基礎(chǔ)知識詳解

    【Linux系統(tǒng)基礎(chǔ)快速入門詳解】SSH遠程連接必備網(wǎng)絡(luò)基礎(chǔ)知識詳解

    魚弦:CSDN內(nèi)容合伙人、CSDN新星導(dǎo)師、51CTO(Top紅人+專家博主) 、github開源愛好者(go-zero源碼二次開發(fā)、游戲后端架構(gòu) https://github.com/Peakchen) SSH(Secure Shell)是一種網(wǎng)絡(luò)協(xié)議,用于通過加密的方式在不安全的網(wǎng)絡(luò)上安全地進行遠程連接和數(shù)據(jù)傳輸。下面是對SSH遠程連接的必備

    2024年02月07日
    瀏覽(29)
  • UNIX基礎(chǔ)知識:UNIX體系結(jié)構(gòu)、登錄、文件和目錄、輸入和輸出、程序和進程、出錯處理、用戶標(biāo)識、信號、時間值、系統(tǒng)調(diào)用和庫函數(shù)

    UNIX基礎(chǔ)知識:UNIX體系結(jié)構(gòu)、登錄、文件和目錄、輸入和輸出、程序和進程、出錯處理、用戶標(biāo)識、信號、時間值、系統(tǒng)調(diào)用和庫函數(shù)

    ? ? ? ? 所有的操作系統(tǒng)都為運行在其上的程序提供服務(wù),比如:執(zhí)行新程序、打開文件、讀寫文件、分配存儲區(qū)、獲得系統(tǒng)當(dāng)前時間等等 ? ? ? ? 從嚴(yán)格意義上來說,操作系統(tǒng)可被定義為一種軟件,它控制計算機硬件資源,提供程序運行的環(huán)境。我們通常將這種軟件稱為

    2024年02月13日
    瀏覽(21)
  • C語言格式化輸出函數(shù)printf詳解——C語言基礎(chǔ)知識

    C語言格式化輸出函數(shù)printf詳解——C語言基礎(chǔ)知識

    (由于篇幅較長,內(nèi)容較全,建議收藏) printf函數(shù)的一般格式為: printf(格式控制字符串,輸出值參數(shù)表); 如: 其中, f=%f,c=%fn 是 格式控制字符串 , f,c 是 輸出值參數(shù)表 。 (1)格式控制字符串是用雙引號括起來的字符串,包括三類信息: 格式字符。格式字符由“%”

    2023年04月08日
    瀏覽(29)
  • 【一文詳解】知識分享:(ASP.Net Core基礎(chǔ)學(xué)習(xí)及快速入門)

    【一文詳解】知識分享:(ASP.Net Core基礎(chǔ)學(xué)習(xí)及快速入門)

    .Net .NET是微軟的一個開發(fā)平臺,這個平臺的一大特點就是跨語言性,不管是什么語言,c、c++、c#、F#、J#、vb等語言都可以用這個平臺合作開發(fā); .NET,它是微軟創(chuàng)建的一個用于構(gòu)建多種不同類型的應(yīng)用程序的開發(fā)人員平臺。 .NET 是一個廣泛的術(shù)語,用于描述整個 Microsoft 的軟件

    2024年02月01日
    瀏覽(154)
  • 【C++入門到精通】C++入門 —— 引用、內(nèi)聯(lián)函數(shù)

    【C++入門到精通】C++入門 —— 引用、內(nèi)聯(lián)函數(shù)

    目錄 一、引用 1.引用的概念 2.引用的特性 3.常引用 4.引用的使用場景 ?????????做參數(shù) ?????????做返回值 5.傳值、傳引用效率比較 值和引用的作為返回值類型的性能比較 6.引用和指針的區(qū)別 ?引用和指針的不同點 ?二、內(nèi)聯(lián)函數(shù) 1.內(nèi)聯(lián)函數(shù)的概念 2.內(nèi)聯(lián)函數(shù)的特性

    2024年02月16日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包