C 學習筆記

2021-09-24 18:02:55 字數 2122 閱讀 7101

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...