1. 程式人生 > >c++常用特性學習總結

c++常用特性學習總結

1.關鍵字和新語法

1.1 auto關鍵字及用法

A.概念和一般用法

auto一般習慣稱作自動型別推斷。由其含義不難得出,凡是前面慣有auto的變數或者函式,其型別將會由編譯器按照上下推斷出來。對於變數,指定要宣告的變數的型別講自動從其初始化中推斷出來。對於函式,指定返回型別為其返回值型別。

#include <iostream>
#include <typeinfo>

using namespace std;
//返回型別為numA + numB 即int
auto test(int numA,int numB)
{
    return numA + numA;
}
int main()
{
    int nNumA = 3,nNumB = 4;
    //返回型別為int
    auto nNumC = test(nNumA, nNumB);
    cout << nNumC << " " << typeid(nNumC).name() << endl;

    return 0;
}

從上面的例子我們可以出來,auto確實進行了自動型別推斷的功能,並且實際型別正確無誤。

B.注意事項

1.auto可以同時宣告多個變數,但變數的型別必須一致。

2.在塊作用域、名稱空間範圍、for迴圈的初始化語句中宣告變數時,可以使用關鍵字AUTO作為型別說明符。

3.在不使用尾部返回型別語法的函式宣告中,關鍵字AUTO表示將使用模板引數演繹規則從返回語句的運算元中推斷返回型別。

4.在使用尾部返回型別語法的函式宣告中,關鍵字AUTO不執行自動型別檢測。它只作為語法的一部分。

C.提醒

直到C++ 11,Auto具有儲存持續時間說明符的語義。

1.2 nullptr關鍵字及用法

A.nullptr的作用

測試如下程式碼

#include <iostream>
using namespace std;
void testA(int n)
{
    cout << "testA" << endl;
}
void testA(int *n)
{
    cout << "testB" << endl;
}
int main()
{
    testA(nullptr);
    testA(NULL);
    return 0;
}

結構如下圖所示

其實我們的本意都是想呼叫testA(int *n),但是測試程式給出的結果和我們的預期又不不同,因為編譯將其解釋為一個空值並不是空指標。

B.內部可能的實施

#define NULL 0
//since C++11
#define NULL nullptr

1.3 基於範圍的迴圈

學習使用c++的時候,我們經常吐槽for迴圈沒有python使用起來那麼方便,每次必須必須至少寫一個引數,但是c++新增基於範圍迴圈的特性,我們可以按照下面的方法使用for迴圈。

#include <iostream>
using namespace std;

int main()
{
    int n [] = {1,2,3,4,5};
    for(auto i : n)
        cout << i << endl;
    return 0;
}

當然,基於範圍的迴圈對於所有STl容器都是適應的。