c 學習筆記(部分語法及c 11新特性)

2021-07-04 06:58:24 字數 2103 閱讀 5146

前言

c++的語法細節實在過雜,再加上c++11的新特性,看了又忘,忘了再看,故講學習過程所得以筆記形式記錄於此。

1. c++對變數初始化的形式

int a = 0; int a = ; int a(0); int a;//叫做列表初始化 c++11時,才得以全面應用

long double b = 1.02; int a(b); int a=b; //正確:轉換執行,但丟失了部分值

int a; int a=;//錯誤:轉換未執行,因為存在丟失資訊的危險

2. 變數宣告和定義的關係

extern int x; //為宣告 int x; //為定義

任何包含了顯示初始化的宣告即為定義 如:extern int a=8; //給a賦初始值抵消了extern的作用

在函式體內部初始化extern標記的變數 將引發錯誤

3.常量

const限定符

const a=2; //在預處理時,編譯器會講所有的a全部用2來替換 (和巨集定義類似)

預設狀態下,const物件僅在檔案內有效。當多個檔案中出現了同名的const變數時,其實等同於在多個檔案同時定義變數

若想一次定義多次宣告式的在多個檔案使用,必須在定義和宣告時都使用 extern來限定

const的引用

const int i=2;

const int &r=i;//正確

&r=i+1; // 錯誤

既然常量值不允許改變,當然也不能通過引用改變 所以引用也必須為const 型別

頂層const和底層constconst int a= 10;//頂層const

int b=10;

int *const p=b;//底層const

簡單的說 用const直接修飾的變數物件等都是頂層const 而指向const變數或物件的指標和引用都是底層const

特殊:const int a=10; const int *const p=a; 此時p既是頂層const又是底層const

4.常量表示式

指值不會改變且在編譯過程中就能得到計算結果的表示式

int a=1;//不是 const int b=2;//是

const int c=b+2;//是 const int d=a+b;//不是

5.auto型別說明符

如果在宣告時不知道變數初始化的值和型別 可以用

auto int a=5,b=4;

auto c = a+b;

編譯器會通過a+b的值來推算變數的型別 所以auto定義的變數必須有初始值

6.decltype型別指示符

如果希望從表示式來得到變數型別,但是並不像用變數的值來進行初始化,可以用decltype型別提示符

用法 decltype(x) sum = 11;

x 可以是函式 f() 可以是變數 可以是表示式 特別的 x可以是引用 引用從來都是做為其所指物件的別名出現

只有在此處是個意外 若 int a; decltype((a)) b; 則b是引用型別

因為變數a是可以作為賦值語句左值的特殊表示式所以(a)的型別便是引用

7.型別別名

typedef typedef a b 將b作為a的別名

using x=y;將x作為y的別名

C 11新特性學習筆記(二)

c 11引入了lambda 匿名函式 這樣就可以在乙個函式只需呼叫一次的地方使用了,類似內聯函式。c 11 的 lambda 表示式規範如下 capture params mutable exception attribute ret 1 capture params ret 2 capture p...

C 11新特性學習

lambda表示式用於建立匿名的函式物件,語法為 函式可訪問的的外部變數 函式引數 返回值型別 如 int a 1,b 2 int c b int x int b 表示函式中可以訪問外部變數b,而且引數b是按值傳遞,b 表示引數b是按引用傳遞,表示可以訪問所有外部變數,並且是用按值傳遞方式,類似,也...

c 11學習筆記

c 98的 std auto ptr已經被徹底遺棄了,取而代之的是unique ptr shared ptr與weak ptr。大部分時候我們自己手動申請記憶體方式記憶體都是沒有問題的,問題是如果程式很大了之後,乙個複雜的物件,多次拷貝的代價非常高,很多地方都會使用到,只存在乙份拷貝顯然是最好的,這...