天天看點

C++成員變量和成員函數分開存儲

在C++中,類内的成員變量和成員函數分開存儲

隻有非靜态成員變量才屬于類的對象上

首先先看一下空對象占用多少空間:

#include <iostream>
using namespace std;
//成員變量和成員函數是分開存儲的

class Person {



};


void test01() {
	Person p;

	cout << "size of p = " << sizeof(p) << endl;
}

int main() {

	test01();
	system("pause");
	return 0;
}
           

結果為size of p = 1;

空對象占用記憶體空間為:1

為什麼是1呢?

因為C++編譯器會給每個空對象也配置設定一個位元組空間,是為了區分空對象占記憶體的位置。

每個空對象也應該有一個獨一無二的記憶體位址,是以編譯器會給每個空對象配置設定一個位元組作為區分。

現在我們給空對象裡面int m_A,看看結果是多少?

代碼如下:

#include <iostream>
using namespace std;
//成員變量和成員函數是分開存儲的

class Person {
		int m_A;//非靜态變量  屬于類對象上的資料


};

void test01() {
	Person p;
	cout << "size of p = " << sizeof(p) << endl;

}


int main() {

	test01();
	system("pause");
	return 0;
}
           

結果為size of p = 4

說明:

非靜态變量m_A屬于類的對象上

現在我們往類中static int m_B,看看結果又如何?

void func()//非靜态函數,結果又如何?

static void func2()呢?

代碼如下:

#include <iostream>
using namespace std;
//成員變量和成員函數是分開存儲的

class Person {
		int m_A;
		static int m_B;//靜态成員變量
		
		void func()
		{
		
		}
		static void func2()
		{
		
		}
};

int Person::m_B = 0;//靜态成員變量特點,類内聲明,類外初始化。不屬于類對象上

void test01() {
	Person p;
	cout << "size of p = " << sizeof(p) << endl;

}


int main() {

	test01();
	system("pause");
	return 0;
}
           

結果都仍然為:4

1.說明靜态成員變量不屬于類對象上。

2.說明成員函數(包括靜态和非靜态)與成員變量分開存儲。

每一個非靜态成員函數隻會誕生一份函數執行個體,也就是說多個同類型的對象會共用一塊代碼,那麼問題是:

這一塊代碼是如何區分哪個對象調用自己的呢?

C++通過提供特殊的對象指針,this指針解決上述問題。

繼續閱讀