C++.png
類
- C++中可以使用struct、class來定義一個(gè)類
- struct和class的區(qū)別
- struct的默認(rèn)成員權(quán)限是public
- class的默認(rèn)成員權(quán)限是private
// struct:
struct Person{
int m_age;
void run(){
cout << m_age << endl;
}
};
//class:
class Person{
public:
int m_age;
void run(){
cout << m_age << endl;
}
};
// ------------
int main() {
Person person;
person.m_age = 10;
person.run();
Person *pPerson = &person;
pPerson->m_age = 20;
pPerson->run();
return 0;
}
- 上面代碼中person對象石景、pPerson指針的內(nèi)存都是在函數(shù)的
椗常空間,自動(dòng)分配和回收的
- 可以嘗試反匯編struct和class潮孽,看看是否有其他區(qū)別【無區(qū)別】
- 實(shí)際開發(fā)中揪荣,用class表示類比較多
C++編程規(guī)范:(變量名規(guī)范參考)
- 全局變量:g_
- 成員變量:m_
- 靜態(tài)變量:s_
- 常量:c_
- 使用駝峰標(biāo)識(shí)
ps:每個(gè)人都可以有自己的編程規(guī)范,沒有統(tǒng)一的標(biāo)準(zhǔn)往史,沒有標(biāo)準(zhǔn)答案仗颈,沒有最好的編程規(guī)范
對象的內(nèi)存布局:
思考:如果類中有多個(gè)成員變量,對象的內(nèi)存又是如何布局的?
Person person;
person.m_age = 10;
person.run();
// 在函數(shù)里創(chuàng)建對象椎例,用上面的這種方式挨决,它的內(nèi)存存放在棧空間
每個(gè)應(yīng)用都有自己獨(dú)立的內(nèi)存空間订歪,其內(nèi)存空間一般都有以下幾大區(qū)域:
- 代碼段(代碼區(qū))
- 用于存放代碼
- 數(shù)據(jù)段(全局區(qū))
- 用于存放全局變量等
- 棽逼恚空間
- 每調(diào)用一個(gè)函數(shù)就會(huì)給它分配一段連續(xù)的棧空間陌粹,等函數(shù)調(diào)用完畢后會(huì)自動(dòng)回收這段椚鱿空間
- 自動(dòng)分配和回收
- 堆空間
- 需要主動(dòng)去申請和釋放
// 應(yīng)用的內(nèi)存空間布局:
|-------------------|
| |
| 棧空間 |
|-------------------|
| 堆空間 |
|-------------------|
| 代碼區(qū) |
|-------------------|
| 全局區(qū) |
| |
|-------------------|
堆空間
- 堆空間的申請\釋放
- malloc \ free
- new \ delete
- new [] \ delete []
- 注意
- 申請堆空間成功后掏秩,會(huì)返回那一段內(nèi)存空間的地址
- 申請和釋放必須是1對1的關(guān)系或舞,不然可能會(huì)存在內(nèi)存泄露
- 現(xiàn)在的很多高級(jí)編程語言不需要開發(fā)人員去管理內(nèi)存(比如Java),屏蔽了很多內(nèi)存細(xì)節(jié)蒙幻,利弊同時(shí)存在
- 利:提高開發(fā)效率映凳,避免內(nèi)存使用不當(dāng)或泄露
- 弊:不利于開發(fā)人員了解本質(zhì),永遠(yuǎn)停留在API調(diào)用和表層語法糖邮破,對性能優(yōu)化無從下手
堆空間的初始化
// *p1未初始化
int *p1 = (int *)malloc(sizeof(int));
int *p2 = (int *)malloc(sizeof(int));
// 把*p2的每一個(gè)字節(jié)都初始化為0
memset(p2, 0, sizeof(int));
int *p1 = new int; // 未初始化
int *p2 = new int(); // 初始化為0
int *p3 = new int(5); // 初始化為5
int *p4 = new int[3]; // 未初始化
int *p5 = new int[3](); // 3個(gè)數(shù)組元素初始化為0
int *p6 = new int[3]{}; // 3個(gè)數(shù)組元素初始化為0
int *p7 = new int[3]{5};// 數(shù)組首元素初始化為5诈豌,其他初始化為0
memset
memset函數(shù)是將較大的數(shù)據(jù)結(jié)構(gòu)(比如對象仆救、數(shù)組等)內(nèi)存清零的比較快的方法
Person person;
person.m_id = 10;
person.m_age = 10;
person.m_height = 10;
memset(&person, 0, sizeof(person));
Person persons[] = {{0,3,105},{1,4,174},{2,6,182}};
memset(persons, 0, sizeof(persons));
ps:memset分配幾個(gè)字節(jié),是由操作系統(tǒng)底層實(shí)現(xiàn)的
對象的內(nèi)存
- 對象的內(nèi)存可以存在于3種地方
- 全局區(qū)(數(shù)據(jù)段):全局變量
- 椡危空間:
函數(shù)
里面的局部變量 - 堆空間:動(dòng)態(tài)申請內(nèi)存(malloc、new等)
// 全局區(qū)
Person g_person;
int main() {
// 棧區(qū)
Person person;
// 堆區(qū)
Person *p = new Person;
return 0;
}
this
隱式參數(shù)
匯編長啥樣庙洼?
this是指向?qū)ο蟮闹羔?/p>
是語法糖
通過指針修改對象成員變量的匯編樣子
指針間接訪問效率顿痪,不見得就比對象高,但是蚁袭,有的地方必須使用指針,例如删性,堆空間,另外汗侵,方便
int3群发,CC CC