天天看点

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指针解决上述问题。

继续阅读