1、C++中指針與引用的區(qū)別 1)指針是一個(gè)新的變量,存儲(chǔ)了另一個(gè)變量的地址,我們可以通過訪問這個(gè)地址來修改另一個(gè)變量; 引用只是一個(gè)別名,還是變量本身,對(duì)引用的任何操作就是對(duì)變量本身進(jìn)行操作,以達(dá)到修改變量的目的 2)引用只有一級(jí),而指針可以有多級(jí) 3)指針傳參的時(shí)候,還是值傳遞,指針本身的值不可以修改,需要通過解引用才能對(duì)指向的對(duì)象進(jìn)行操作。 引用傳參的時(shí)候,傳進(jìn)來的就是變量本身,因此變量可以被修改。 2、結(jié)構(gòu)體(struct): 將不同類型的數(shù)據(jù)組合成一個(gè)整體,sizeof(struct)是內(nèi)存對(duì)齊后所有成員長(zhǎng)度的總和。 3、內(nèi)存對(duì)齊:(轉(zhuǎn)自:http://www./article/2021/01/2100/0011500966600.html)
例1:(假設(shè)指定對(duì)齊字節(jié)為8,那么n = min(8,4) = 4) class node{ int i; //放在位置0,位置區(qū)間[0~3] char c; //1 < n, 那么放置起始位置應(yīng)該是1的倍數(shù),即4,位置區(qū)間為[4] short s; //2 < n,那么放置起始位置應(yīng)該是2的倍數(shù),即6,位置區(qū)間為[6~7]} 成員共占據(jù)[0~7]8個(gè)字節(jié),剛好是4的倍數(shù),因此大小是8 例2:(假設(shè)指定對(duì)齊字節(jié)是2,則n = min(2,4) = 2) class node{ char c; //放在位置0,位置區(qū)間[0] int i; //4 > n, 那么放置起始位置應(yīng)該是2的倍數(shù),即2,位置區(qū)間為[2~5] short s; //2 = n,那么放置起始位置應(yīng)該是2的倍數(shù),即6,位置區(qū)間為[6~7]} 此時(shí)成員共占用[0~7]8個(gè)字節(jié),剛好是4的倍數(shù),因此大小是8 4、#define和const的區(qū)別 1)#define定義的常量沒有類型,所給出的是一個(gè)立即數(shù);const定義的常量有類型名字,存放在靜態(tài)區(qū)域 2)處理階段不同,#define定義的宏變量在預(yù)處理時(shí)進(jìn)行替換,可能有多個(gè)拷貝,const所定義的變量在編譯時(shí)確定其值,只有一個(gè)拷貝。 3)#define定義的常量是不可以用指針去指向,const定義的常量可以用指針去指向該常量的地址 4)#define可以定義簡(jiǎn)單的函數(shù),const不可以定義函數(shù) 5、重載:同一類中,函數(shù)名相同,參數(shù)和返回值不同(相同范圍(同一個(gè)類中)、函數(shù)名字相同、參數(shù)不同、virtual關(guān)鍵字可有可無) 覆蓋:派生類覆蓋基類的虛函數(shù),實(shí)現(xiàn)接口的重用(不同范圍(基類和派生類)、函數(shù)名字相同、參數(shù)相同、基類中必須有virtual關(guān)鍵字(必須是虛函數(shù))) 重寫:派生類屏蔽了其同名的基類函數(shù)(不同范圍(基類和派生類)、函數(shù)名字相同、參數(shù)不同或者參數(shù)相同且無virtual關(guān)鍵字) 6、new、delete、malloc、free之間的關(guān)系 new/delete,malloc/free都是動(dòng)態(tài)分配內(nèi)存的方式 1)malloc對(duì)開辟的空間大小嚴(yán)格指定,而new只需要對(duì)象名 2)new為對(duì)象分配空間時(shí),調(diào)用對(duì)象的構(gòu)造函數(shù),delete調(diào)用對(duì)象的析構(gòu)函數(shù) 既然有了malloc/free,C++中為什么還需要new/delete呢? 因?yàn)閙alloc/free是庫函數(shù)而不是運(yùn)算符,不能把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的功能強(qiáng)加于malloc/free. 7.STL庫:(轉(zhuǎn)載:https://blog.csdn.net/qq_41431457/article/details/88898925) STL(Standard Template Library),即標(biāo)準(zhǔn)模板庫,是一個(gè)具有工業(yè)強(qiáng)度的,高效的C++程序庫。 vector:是支持隨機(jī)訪問的迭代器 vector的動(dòng)態(tài)增加大小的時(shí)候,并不是在原有的空間上持續(xù)新的空間(無法保證原空間的后面還有可供配置的空間),而是以原大小的兩倍另外配置一塊較大的空間,然后將原內(nèi)容拷貝過來,并釋放原空間。在VS下是1.5倍擴(kuò)容,在GCC下是2倍擴(kuò)容。 #include<iostream>#include<vector>using namespace std;//iterator模式:提供一種方法,使之能依次訪問容器內(nèi)的各個(gè)元素,而又不暴露該聚合物內(nèi)部的表述方式。 void print(vector<int>&v){for(vector<int>::iterator i=v.begin();i!=v.end();i++){ cout<<*i<<" "; } cout<<endl; }//四種定義方法 void test01() { vector<int>v1;for(int i=0;i<10;i++){ v1.push_back(i); } print(v1); vector<int>v2(v1.begin(),v1.end()); print(v2); vector<int>v3(10,100); print(v3); vector<int>v4(v3); print(v4); //賦值 opertor= vector<int>v5; v5=v1; print(v5); //assign賦值vector <int>v6; v6.assign(v1.begin(),v1.end()); print(v6); vector <int>v7; v7.assign(10,1);//10個(gè)1 print(v7); //插入,第一個(gè)參數(shù)是迭代器v7.insert(v7.begin(),1000) ; print(v7); v7.insert(v7.begin(),3,11111000) ; print(v7); }int main() { test01(); return 0; } 8、const const修飾類的成員變量,表示常量不可能被修改 const修飾類的成員函數(shù),表示該函數(shù)不會(huì)修改類中的數(shù)據(jù)成員,不會(huì)調(diào)用其他非const的成員函數(shù) static: 12、關(guān)鍵字static的作用 1)函數(shù)體內(nèi): static 修飾的局部變量作用范圍為該函數(shù)體,不同于auto變量,其內(nèi)存只被分配一次,因此其值在下次調(diào)用的時(shí)候維持了上次的值 2)模塊內(nèi):static修飾全局變量或全局函數(shù),可以被模塊內(nèi)的所有函數(shù)訪問,但是不能被模塊外的其他函數(shù)訪問,使用范圍限制在聲明它的模塊內(nèi) 3)類中:修飾成員變量,表示該變量屬于整個(gè)類所有,對(duì)類的所有對(duì)象只有一份拷貝 4)類中:修飾成員函數(shù),表示該函數(shù)屬于整個(gè)類所有,不接受this指針,只能訪問類中的static成員變量 9.堆和棧的區(qū)別
10、C++中的內(nèi)存管理 在C++中,內(nèi)存被分成五個(gè)區(qū):棧、堆、代碼區(qū)、全局/靜態(tài)存儲(chǔ)區(qū)、常量區(qū) 代碼區(qū): 棧:存放函數(shù)的參數(shù)和局部變量,編譯器自動(dòng)分配和釋放 堆:new關(guān)鍵字動(dòng)態(tài)分配的內(nèi)存,由程序員手動(dòng)進(jìn)行釋放,否則程序結(jié)束后,由操作系統(tǒng)自動(dòng)進(jìn)行回收 全局/靜態(tài)存儲(chǔ)區(qū):存放全局變量和靜態(tài)變量 常量區(qū):存放常量,不允許被修改 |
|