C++(静态成员变量、函数、this指针)

本文探讨C++中的静态成员变量和函数,强调它们不属于特定对象而是被所有类实例共享。同时,介绍了this指针的概念,它是隐式存在的,指向调用成员函数的对象地址,确保函数操作的是正确对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

静态成员变量及函数

使用static关键字定义,需要注意静态变量不单独属于某一个对象,所有该类的对象都可以访问同一个静态变量,但是私有静态变量不能共享。成员函数一样。

class car
{
	public:
		static string m_name;//静态成员变量
		//静态成员函数只能访问静态变量,因为静态成员函数所有对象共享,故调用时里面如果使用了非静态变量
		//又因为静态成员函数不属于类对象本身,则编译器无法识别调用的是哪个对象的非静态变量
		//更简单的说,当直接使用域作用符,如car::nameIs("BWM",1);里面包含非静态变量
		//但是并不能知道调用的是谁的num变量,甚至这个类还没创建过对象,那怎么用
		static void nameIs(string name)//static void nameIs(string name,int num)
		{
			m_name = name;
			//m_num = num;
			cout<<"The car's name is "<<name<<endl;
		}
	private:
		static int m_num;
};
//静态变量使用前需要在类外初始化
string car::m_name = " ";

car c1;
//可以访问
c1.m_name="sss";//类对象访问
car::m_name="sss";//域符号访问
//不可访问
c1.num=1;//使用错误,没有访问权限

成员变量和成员函数分开存储,只有非静态变量属于类创建的对象的内存空间

class car{}; 
car c1;
cout<<sizeof(c1)<<endl;
//直接sizeof(car)也是一样的,此时字节大小为1;空对象也占据一个字节,用于区分不同的空对象

class car
{
	int a;
}; 
car c2;
cout<<sizeof(c2)<<endl;
//输出为4,非静态变量占据类对象的存储空间,此时只算上成员变量的存储空间,不会额外再分配一个字节空间


class car
{
	int a;
	static int b;
}; 
car c3;
cout<<sizeof(c3)<<endl;
//输出为4,静态变量不占据类对象的存储空间

class car
{
	int a;
	static int b;
	void nameIs(){}
}; 
car c4;
cout<<sizeof(c4)<<endl;
//输出为4,成员函数不占据类对象的存储空间
//而成员函数实际上只有一个存储空间,所有同类对象都调用的其实是一个成员函数

当调用成员函数的时候,该对象会在函数内调用一个this指针,当然,是隐式的,我们虽然看不到,但是要知道是这么回事,指针指向当前的对象,故,调用的函数也是当前对象的函数了

this指针

this指针是本身就存在的,我们直接使用,其本质是一个指针常量,以下的this指针:car* const this=当前对象地址;

class car
{
	public:
		car(int num,string name)
		{
			//this指针指向当前对象,在使用构造函数时,将外部的参数传给形参,当形参名字和类内部变量相同
			//this指针指向的表示该对象的变量,而不是传过来的形参
			this->num=num;
			this->name=name;
		}
		this* addNum(car &c);
	private:
		int num;
		string name;
};

//this指针可以返回当前对象

```cpp
//该函数在上类之内, 通过this指针解引用取出当前指向的对象,则可以利用同一个函数链式操作
//在这里不能写成car car::addNum(car &c),因为值返回的话会创建新的副本,返回的不是对象本身
//返回的是当前对象经过拷贝构造函数创建的副本对象,下面的链式调用时,不会是c1的num一直加,而是
//执行第一次相加之后,就是副本的num在相加了
car& car::addNum(car &c)
{
	this->num +=c.num;
	return *this;
}

//函数链式操作如下
car c1(1,"BWM");
car c2(2,"WuLing");
c1.addNum(c2).addNum(c2).addNum(c2).addNum(c2);//此时c1.num结果为1+2+2+2+2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值