1. 程式人生 > >C++編譯器是如何管理類和對象的,類的成員函數和成員變量

C++編譯器是如何管理類和對象的,類的成員函數和成員變量

print bsp 語言 sharp 調用 變量 private %d cte

C++中的class從面向對象理論出發,將變量(屬性)和函數(方法)集中定義在一起,用於描述現實世界中的類。從計算機的角度,程序依然由數據段(棧區內存)和代碼段(代碼區內存)構成。

#include "stdafx.h"
#include "iostream"
using namespace std;
 
class C1
{
public:
    int i; //4 
    int j; //4
    int k; //4
protected:
private:
}; //12
 
class C2
{
public:
    int i; //4
    int
j; //4 int k; //4 static int m; //4 public: int getK() const { return k; } //4 void setK(int val) { k = val; } //4 protected: private: }; //24 16 struct S1 { int i; int j; int k; }; //12 struct S2 { int i; int j; int k; static int m; };
//16 int main() { printf("c1:%d \n", sizeof(C1)); // 結果是12 printf("c2:%d \n", sizeof(C2)); // 結果是12 printf("s1:%d \n", sizeof(S1)); // 結果是12 printf("s2:%d \n", sizeof(S2)); // 結果是12 system("pause"); return 0; }

為什麽都是12呢?原因如下:
1)C++類對象中的成員變量成員函數分開存儲

成員變量:數據段(棧區內存)

普通成員變量:存儲於對象中,與struct變量有相同的內存布局和字節對齊方式

靜態成員變量:存儲於全局數據區中

成員函數:存儲於代碼段中。

問題出來了:很多對象公用一塊代碼?代碼是如何區分具體對象的?

換句話說:int getK() const { return k; },代碼是如何區分,具體obj1、obj2、obj3對象的k值?



C++會將class中的成員變量提取出來放在棧區的一個同名的struct裏面,將成員函數提取出來放在代碼區,
同時會對起做一些修改,就是默認添加一個this指針的參數,這樣在具體對象調用的時候如a.getI()就會將this傳遞過去,
(註:每一個類的對象都會默認包含一個this指針的成員變量),這樣就是區分到底是哪一個對象去調用類的成員函數了

1、C++類對象中的成員變量和成員函數是分開存儲的。C語言中的內存四區模型仍然有效!

2、C++中類的普通成員函數都隱式包含一個指向當前對象的this指針。

3、靜態成員函數、成員變量屬於類

靜態成員函數與普通成員函數的區別:

  靜態成員函數不包含指向具體對象的指針

  普通成員函數包含一個指向具體對象的指針

  


C++編譯器是如何管理類和對象的,類的成員函數和成員變量