a.c++11特性
1.auto關鍵字:編譯器去分析表示式型別進而推算變數型別
auto sum=val1+val2;
編譯器通過分析val1和val2的值來確定sum的型別
2.範圍for語句:
for(declaration:expression)
statement
適用於序列(陣列,vector,string物件)
for(int &r:v)
r+=2;//引用變數r才可以被修改
3.constexp: 修飾表示式或者函式,使得編譯器知道其為常量
4.智慧型指標:自動釋放所指向的物件(標頭檔案memory)
shared_ptr:多個指標指向同乙個物件
unique_ptr:獨佔所指向的物件
weak_ptr:一種弱引用,指向shared_ptr所管理的物件
智慧型指標是模板:
shared_ptr p;//可以指向基本型別或者stl容器
預設初始化的智慧型指標為空指標
1). shared_ptr:
make_shared:分配使用動態記憶體,必須指定想要建立的物件的型別
shared_ptr p1=make_ptr(42);//p1指向值為42
引用計數:每個shared_ptr都有乙個引用計數器,計數器值為0,自動釋放所管理的物件
計數器值增加:
乙個shared_ptr初始化另乙個shared_ptr;將其作為引數傳遞給另乙個函式;作為函式返回值
計數器值減少:()
給shared_ptr賦予乙個新值;shared_ptr被銷毀(例如離開作用域)
auto p=make_ptr(43);
auto p(q);
shared_ptr的析構函式:計數器值減少,引用計數為0,銷毀物件,釋放記憶體
2)unique_ptr:
乙個unique_ptr指向乙個給定物件;當其被銷毀時,物件也被銷毀;不支援普通的拷貝和賦值操作
初始化unique_ptr必須採用直接初始化形式:
unique_ptr p(new int(12));
release()/reset()函式將指標的所有權進行轉移
release():切斷物件與原來指標的聯絡,返回指向此物件的指標,並將當前指標置為空。
unique_ptr p2(p1.release());//將所有權從p1轉移給p2,p1置空
p3.reset(p2.release());//將所有權從p2轉移到p3,p2置空
注:如果不進行初始化或者物件賦值,需要使用乙個智慧型指標來儲存release()返回的指標,並用delete釋放記憶體
auto p=p1.release();
delete p;
3)weak_ptr
不控制指向物件生存期的智慧型指標,它指向由乙個shared_ptr管理的物件,並且weak_ptr繫結到shared_ptr不會改變shared_ptr的引用計數
weak_ptr的建立需要shared_ptr來初始化完成
auto p=make_shared(42);
weak_ptr wp§;//wp弱共享p,p的引用計數未改變
lock():返回乙個指向共享物件的shared_ptr
b. const
1.常量物件必須由常量引用或者常量指標繫結,反之不成立,常量引用和常量物件可以指向非常量物件。
2.常量指標:從右向左分析
int *const p;//表示p是乙個常量指標指向的是乙個int型的物件,指標p裡存的指向物件的位址值不可改變
const int *const p;//表示p是乙個常量指標指向乙個int型常量物件,指標p和指標所指的物件的值都不可改變
頂層const:表示指標本身是個常量
底層const:表示指標所指的物件是個常量,可以修改指標內容
底層const: const int *p;//表示p指標指向乙個常量的int物件
c.new 和delete 動態記憶體管理易出現的問題:
1.忘記delete,記憶體洩漏
2.使用已經delete後的物件,通過賦予nullptr,可以檢查出這種錯誤
3.同一塊記憶體被釋放兩次(例如淺拷貝,兩個指標指向同乙個物件,當乙個delete後,另乙個又去delete會發生這種錯誤)
C 學習筆記( )
一 語法 迴圈 foreach 型別識別符號 in 表示式 code 用法 例子int temp foreach int num in temp 每次從temp取乙個元素賦給num直至取完 console.writeline n num 每行顯示乙個元素 執行結果 c 中唯讀 只寫控制 class ...
C 學習筆記
1.函式特徵 有函式頭和函式體 接受乙個引數 返回乙個值 需要乙個原型。2.c 命名規則 在名稱中只能使用字母字元 數字和下劃線 名稱的第乙個字元不能是數字 區分大寫字母和小寫字母 不能將c 關鍵字用作名稱 以兩個下劃線或下劃線和大寫字母打頭的名稱被保留給實現 編譯器及其使用的資源 使用,以乙個下劃...
c 學習筆記
屬性 屬性開頭字母大寫 屬性可以判斷輸入的非法值 屬性本身不儲存值 依靠字段 索引器 using system using system.collections.generic using system.linq using system.text namespace b try catch exc...