前言
c++的語法細節實在過雜,再加上c++11的新特性,看了又忘,忘了再看,故講學習過程所得以筆記形式記錄於此。1. c++對變數初始化的形式
int a = 0; int a = ; int a(0); int a;//叫做列表初始化 c++11時,才得以全面應用2. 變數宣告和定義的關係long double b = 1.02; int a(b); int a=b; //正確:轉換執行,但丟失了部分值
int a; int a=;//錯誤:轉換未執行,因為存在丟失資訊的危險
extern int x; //為宣告 int x; //為定義3.常量任何包含了顯示初始化的宣告即為定義 如:extern int a=8; //給a賦初始值抵消了extern的作用
在函式體內部初始化extern標記的變數 將引發錯誤
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.常量表示式
指值不會改變且在編譯過程中就能得到計算結果的表示式5.auto型別說明符int a=1;//不是 const int b=2;//是
const int c=b+2;//是 const int d=a+b;//不是
如果在宣告時不知道變數初始化的值和型別 可以用6.decltype型別指示符auto int a=5,b=4;
auto c = a+b;
編譯器會通過a+b的值來推算變數的型別 所以auto定義的變數必須有初始值
如果希望從表示式來得到變數型別,但是並不像用變數的值來進行初始化,可以用decltype型別提示符7.型別別名用法 decltype(x) sum = 11;
x 可以是函式 f() 可以是變數 可以是表示式 特別的 x可以是引用 引用從來都是做為其所指物件的別名出現
只有在此處是個意外 若 int a; decltype((a)) b; 則b是引用型別
因為變數a是可以作為賦值語句左值的特殊表示式所以(a)的型別便是引用
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。大部分時候我們自己手動申請記憶體方式記憶體都是沒有問題的,問題是如果程式很大了之後,乙個複雜的物件,多次拷貝的代價非常高,很多地方都會使用到,只存在乙份拷貝顯然是最好的,這...