轉載:https://blog.csdn.net/ljh0302/article/details/81098764?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161494999616780262523772%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161494999616780262523772&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-81098764.first_rank_v2_pc_rank_v29_10&utm_term=C%2B%2B%E7%AC%94%E8%AF%95%E9%9D%A2%E8%AF%95%E9%A2%98
1、C++中指標與參考的區別
1)指標是一個新的變數,存盤了另一個變數的地址,我們可以通過訪問這個地址來修改另一個變數;
參考只是一個別名,還是變數本身,對參考的任何操作就是對變數本身進行操作,以達到修改變數的目的
2)參考只有一級,而指標可以有多級
3)指標傳參的時候,還是值傳遞,指標本身的值不可以修改,需要通過解參考才能對指向的物件進行操作,
參考傳參的時候,傳進來的就是變數本身,因此變數可以被修改,
2、結構體(struct):
將不同型別的資料組合成一個整體,sizeof(struct)是記憶體對齊后所有成員長度的總和,
3、記憶體對齊:(轉自:http://www.pinlue.com/article/2021/01/2100/0011500966600.html)
| int | short | long | char | cahr* | float | double | |
| 32位 | 4 | 2 | 4 | 1 | 4 | 4 | 8 |
| 64位 | 4 | 2 | 8 | 1 | 8 | 4 | 8 |
例1:(假設指定對齊位元組為8,那么n = min(8,4) = 4)
class node{int i; //放在位置0,位置區間[0~3]char c; //1 < n, 那么放置起始位置應該是1的倍數,即4,位置區間為[4]short s; //2 < n,那么放置起始位置應該是2的倍數,即6,位置區間為[6~7]}
成員共占據[0~7]8個位元組,剛好是4的倍數,因此大小是8
例2:(假設指定對齊位元組是2,則n = min(2,4) = 2)
class node{char c; //放在位置0,位置區間[0]int i; //4 > n, 那么放置起始位置應該是2的倍數,即2,位置區間為[2~5]short s; //2 = n,那么放置起始位置應該是2的倍數,即6,位置區間為[6~7]}
此時成員共占用[0~7]8個位元組,剛好是4的倍數,因此大小是8
4、#define和const的區別
1)#define定義的常量沒有型別,所給出的是一個立即數;const定義的常量有型別名字,存放在靜態區域
2)處理階段不同,#define定義的宏變數在預處理時進行替換,可能有多個拷貝,const所定義的變數在編譯時確定其值,只有一個拷貝,
3)#define定義的常量是不可以用指標去指向,const定義的常量可以用指標去指向該常量的地址
4)#define可以定義簡單的函式,const不可以定義函式
5、多載:同一類中,函式名相同,引數和回傳值不同(相同范圍(同一個類中)、函式名字相同、引數不同、virtual關鍵字可有可無)
覆寫:派生類覆寫基類的虛函式,實作介面的重用(不同范圍(基類和派生類)、函式名字相同、引數相同、基類中必須有virtual關鍵字(必須是虛函式))
重寫:派生類屏蔽了其同名的基類函式(不同范圍(基類和派生類)、函式名字相同、引數不同或者引數相同且無virtual關鍵字)
6、new、delete、malloc、free之間的關系
new/delete,malloc/free都是動態分配記憶體的方式
1)malloc對開辟的空間大小嚴格指定,而new只需要物件名
2)new為物件分配空間時,呼叫物件的建構式,delete呼叫物件的解構式
既然有了malloc/free,C++中為什么還需要new/delete呢?
因為malloc/free是庫函式而不是運算子,不能把執行建構式和解構式的功能強加于malloc/free.
7.STL庫:(轉載:https://blog.csdn.net/qq_41431457/article/details/88898925)
STL(Standard Template Library),即標準模板庫,是一個具有工業強度的,高效的C++程式庫,
vector:是支持隨機訪問的迭代器









vector的動態增加大小的時候,并不是在原有的空間上持續新的空間(無法保證原空間的后面還有可供配置的空間),而是以原大小的兩倍另外配置一塊較大的空間,然后將原內容拷貝過來,并釋放原空間,在VS下是1.5倍擴容,在GCC下是2倍擴容,
#include<iostream> #include<vector> using namespace std; //iterator模式:提供一種方法,使之能依次訪問容器內的各個元素,而又不暴露該聚合物內部的表述方式, 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個1 print(v7); //插入,第一個引數是迭代器 v7.insert(v7.begin(),1000) ; print(v7); v7.insert(v7.begin(),3,11111000) ; print(v7); } int main() { test01(); return 0; }
8、const
const修飾類的成員變數,表示常量不可能被修改
const修飾類的成員函式,表示該函式不會修改類中的資料成員,不會呼叫其他非const的成員函式
static:
12、關鍵字static的作用
1)函式體內: static 修飾的區域變數作用范圍為該函式體,不同于auto變數,其記憶體只被分配一次,因此其值在下次呼叫的時候維持了上次的值
2)模塊內:static修飾全域變數或全域函式,可以被模塊內的所有函式訪問,但是不能被模塊外的其他函式訪問,使用范圍限制在宣告它的模塊內
3)類中:修飾成員變數,表示該變數屬于整個類所有,對類的所有物件只有一份拷貝
4)類中:修飾成員函式,表示該函式屬于整個類所有,不接受this指標,只能訪問類中的static成員變數
9.堆和堆疊的區別
| 堆heap | 低址-高址 | 記憶體手動釋放 | 效率低 | 函式的引數值、區域變數 |
| 堆疊stack | 高-低 | 自動 | 效率高 | new |
10、C++中的記憶體管理
在C++中,記憶體被分成五個區:堆疊、堆、代碼區、全域/靜態存盤區、常量區
代碼區:
堆疊:存放函式的引數和區域變數,編譯器自動分配和釋放
堆:new關鍵字動態分配的記憶體,由程式員手動進行釋放,否則程式結束后,由作業系統自動進行回收
全域/靜態存盤區:存放全域變數和靜態變數
常量區:存放常量,不允許被修改
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266885.html
標籤:C++
上一篇:springboot連接MySql8 報錯:Access denied for user 'root'@'localhost' (using password:
