c++ day8 静态成员变量和函数(理解中),成员变量和成员函数分开存储

本文介绍了C++中的静态成员,包括静态成员变量和静态成员函数。静态成员变量被所有对象共享,存储在全局区,可通过对象或类名访问。静态成员函数同样被所有对象共享,只能访问静态成员变量,不能直接访问非静态成员变量,因为它们不依赖于特定对象。此外,还讨论了成员变量和成员函数的存储位置,以及空对象占用的内存情况。
摘要由CSDN通过智能技术生成

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。

静态成员分为:

静态成员变量

  • 所有对象共同分享同一数据
  • 在编译阶段分配内存(全局区)
  • 类内声明,类外初始化(注意表现形式)

          1.通过对象访问

          2.通过类名访问

class person
{
public:
	static int m_age;  //静态成员变量的类内声明
private:
	static int m_tel;    //也有权限的设置
};

int  person::m_age = 100;//类外初始化
int  person::m_tel = 100;

int main()   
{	
	person p;
	cout << p.m_age << endl;   //静态成员变量未初始化。必须类内声明,类外初始化 
	person p2;
	p2.m_age = 1;
	cout << p.m_age << endl;  //这里依然用的p.m_age,但因为所有对象共享同一数据,所以p2改变了,p也变
	cout << person::m_age << endl; //直接通过类名访问
	system("pause");              
	return 0;   
}

静态成员函数

  • 所有对象共享同一个函数
  • 静态成员函数只能访问静态成员变量

//静态成员函数可以访问静态成员变量。因为这个是共享的,不需要特定对象,都可以用
        //asd = 1000; //但不可访问非静态成员变量。
        //因为类[的所有对象共享同一函数,而非静态成员变量必须有一个特定对象才能访问。
        //所以将非静态成员变量放进静态成员函数时,如果调用这个函数,不知道是改变的哪一个对象上的非静态成员变量。
就是有了特定对象后,才给这个非静态属性分配内存

(待修改)

class person
{
public:
	static void func()
	{
		m_age = 100;  //静态成员函数可以访问静态成员变量。因为这个是共享的,不需要特定对象,都可以用
		//asd = 1000; //但不可访问非静态成员变量。
		//因为类的所有对象共享同一函数,而非静态成员变量必须有一个特定对象来访问。
		//所以将非静态成员变量放进静态成员函数时,如果调用这个函数,不知道是改变的哪一个对象上的
		//非静态成员变量
		cout << "静态成员函数的调用" << endl;
	}
	static int m_age;
	int asd;  //非静态成员变量
};

void test()
{
	//1.通过对象访问
	person p;
	p.func();
	//2.通过类名访问
	person::func();
}

int person::m_age = 11;

int main()   
{	
	test();
	person p;
	system("pause");              
	return 0;   
}


3.成员变量和成员函数分开存储

sizeof(p);空对象时占用内存空间为1

C++编译器给每个空对象分配1个字节的内存,是为了区分空对象占内存的位置,独一无二的内存地址

class person

{

int b;//4个字节,在类的对象上(特定对象)

static int b ; //4个字节,静态成员变量不属于类的对象(都可以用)

void func(){}  //非静态成员函数,不属于类的对象

static void  func(){}  //静态成员函数不属于类的对象

属于类的对象解释:

空类,即class person

{

}

void test()

{

person p;

cout << sizeof(p) << endl; //因为是空对象,所以占用内存为1字节

}

 但在class person中加了一个属性int b后,sizeof(p)的内存由1变成了4字节,所以非静态成员变量在类的对象上。

继续加static int b ; void func(){} ;static void  func(){} ;sizeof(p)依然为4个字节大小。所以这三个不在类的对象上。

所以成员变量和成员函数是分开存储的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值