0. 回歸本質(zhì)
class
是一種特殊的struct
蕉毯,class
的默認(rèn)訪問(wèn)權(quán)限是private
第煮,struct
的默認(rèn)訪問(wèn)權(quán)限是public
健爬。
- 在內(nèi)存中
class
依舊可以看作是變量的集合 -
class
與struct
遵循相同的內(nèi)存對(duì)齊規(guī)則 -
class
中的成員函數(shù)和成員變量是分開(kāi)存放的佩耳, 成員變量存放在棧砂竖、堆或者常量區(qū)中真椿, 成員函數(shù)存放在代碼段。
每個(gè)對(duì)象有獨(dú)立的成員變量乎澄,所有的對(duì)象共享類(lèi)中的成員函數(shù)突硝。
編程說(shuō)明:對(duì)象內(nèi)存布局初探
#include <iostream>
#include <string>
using namespace std;
class A
{
int i;
int j;
char c;
double d;
public:
void print()
{
cout << "i = " << i << ", "
<< "j = " << j << ", "
<< "c = " << c << ", "
<< "d = " << d << endl;
}
};
struct B
{
int i;
int j;
char c;
double d;
};
int main()
{
A a;
cout << "sizeof(A) = " << sizeof(A) << endl;
cout << "sizeof(a) = " << sizeof(a) << endl;
cout << "sizeof(B) = " << sizeof(B) << endl; // 內(nèi)存對(duì)齊: 20byte
a.print();
B* p = reinterpret_cast<B*>(&a);
p->i = 1;
p->j = 2;
p->c = 'a';
p->d = 3;
a.print();
B& bp = reinterpret_cast<B&>(a);
bp.i = 10;
bp.j = 20;
bp.c = 'b';
bp.d = 4.3;
a.print();
return 0;
}
輸出結(jié)果:
sizeof(A) = 20
sizeof(a) = 20
sizeof(B) = 20
i = -1219554259, j = -1218018364, c = , d = -8.07148e-42
i = 1, j = 2, c = a, d = 3
i = 10, j = 20, c = b, d = 4.3
1. C++對(duì)象模型分析——成員變量分析
運(yùn)行時(shí)的對(duì)象退化為結(jié)構(gòu)體的形式:
(1) 所有成員變量在內(nèi)存中依次排布
(2) 成員變量間可能存在內(nèi)存間隙(內(nèi)存對(duì)齊)
(3) 可以通過(guò)內(nèi)存地址直接訪問(wèn)成員變量(通過(guò)指針或者引用可以直接修改對(duì)象中成員變量的值)
(4) 訪問(wèn)權(quán)限關(guān)鍵字在運(yùn)行時(shí)失效(訪問(wèn)權(quán)限關(guān)鍵字只在編譯器有效,在運(yùn)行期無(wú)效)
2. C++對(duì)象模型分析——成員函數(shù)分析
- 類(lèi)中的成員函數(shù)位于代碼段中
- 調(diào)用成員函數(shù)時(shí)對(duì)象地址作為參數(shù)隱式傳遞
- 成員函數(shù)通過(guò)對(duì)象地址訪問(wèn)成員變量
- C++語(yǔ)法規(guī)則隱藏了對(duì)象地址的傳遞過(guò)程
3. C語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟆狙a(bǔ)充】
4. 小結(jié)
- C++中的類(lèi)對(duì)象在內(nèi)存布局上與結(jié)構(gòu)體相同
- 成員變量和成員函數(shù)在內(nèi)存中分開(kāi)存放
- 訪問(wèn)權(quán)限關(guān)鍵字在運(yùn)行時(shí)失效
- 調(diào)用成員函數(shù)時(shí)對(duì)象地址作為參數(shù)隱式傳遞