程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++編譯器對屬性和方法的處理機制

C++編譯器對屬性和方法的處理機制

編輯:關於C++

 

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

C++編譯器如何完成面向對象理論到計算機程序的轉化?

換句話:C++編譯器是如何管理類、對象、類和對象之間的關系

具體的說:具體對象調用類中的方法,那,c++編譯器是如何區分,是哪個具體的類,調用這個方法?

demo

 

#include 

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:
}; //大小可能是12,可能是16,可能是24 

struct S1
{
	int i;
	int j;
	int k;
}; // 大小是12

struct S2
{
	int i;
	int j;
	int k;
	static int m;
}; // 大小可能是12,可能是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

}

 

通過上面的demo,我們可以的得出:

1)C++類對象中的成員變量和成員函數是分開存儲的

成員變量:

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

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

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


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

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

看下圖

\

 

對於普通成員函數,C++編譯器做了一層封裝,比如Test類的構造函數,其中雖然只寫了一個參數i,但實際上就像右面結構體的初始化函數那樣,類的構造函數隱藏定義了一個this指針。

而靜態成員函數,不需要this指針,因為是共用的,對於類只需要標注作用域就可以了。

所以執行Test a(10); 就相當於 Test a; Test_initialize(%a, 10);其他的類似對比就懂了。

 

總結:

 

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

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

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

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

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

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved