python类定义成员变量无值_C++:类的静态成员变量和静态成员函数详解

类static成员由该类所有对象共享的成员变量,要创建这样的成员,只需将关键字 static 放在变量声明的前面,并在类之外放置一个单独的变量定义,类的静态成员变量需要在类外分配内存空间;

普通成员变量

普通成员变量为类的各实例对象所各自拥有一份,且每个对象所占的内存大小为所有普通成员变量所占内存之和;

class Test{public:Test(){};~Test(){};void setA(int x){this->a = x;}void setB(int x){this->b = x;}int getA(){return this->a ;}int getB(){return this->b ;}private:int a ;int b ;};void main(){Test t1 ;Test t2 ;t1.setA(10);t1.setB(20) ;t2.setA(30) ;t2.setB(40) ;cout<

运行结果为:

10308

可见,t1和t2各自有一块内存存放变量a;

32396f8deda3858b0c4101a71fc4331f.png

静态成员变量

静态成员变量

class Test{public:Test(){};~Test(){};void setA(int x){this->a = x;}void setB(int x){this->b = x;}int getA(){return this->a ;}int getB(){return this->b ;}private:static int a ;//申明为静态变量int b ;};void main(){Test t1 ;Test t2 ;t1.setA(10); cout<

如果只是在类中通过static int a ;//申明为静态变量,在为对象的成员a赋值时是会报错的。这是为什么呢?这是因为系统并未给实例化的对象分配成员a的内存。成员a属于静态变量,其生命周期不由某个对象决定,类的各对象也并不含有成员a的内存。

因此,对于成员变量a,需要单独为其申请内存。int Test::a;

最终正确写法为:

class Test{public:Test(){};~Test(){};void setA(int x){this->a = x;}void setB(int x){this->b = x;}int getA(){return this->a ;}int getB(){return this->b ;}private:static int a ;int b ;};int Test::a = 0;//在类外为静态成员变量分配内存空间

然后运行上面的main()函数,结果为:

1030304

t1的成员a在t2.setA(30) ;后为什么也变成了与t2.a一样都是30呢?并且t1的大小只有4?

这是因为,静态成员变量为所有类共享,同类的成员函数一样,系统单独为其分配一块空间,多有对象共享这块内存;

c439af5e2c30b8c95dbb97a27da4d2cb.png

静态成员函数

都知道成员函数也是单独分配内存,由类的所有对象共享。那么静态成员函数与普通成员函数有什么区别?

static void func(){this->a = 10 ;//错误,this指针只能能用于非静态函数内部b = 100 ;//不能访问非静态变量a = 100 ;}

静态成员函数由类名直接调用:

static void func(){a = 100 ;}void main(){ Test::func();cout<

正是因为静态成员函数不能由对象调用而是又类直接调用,所以this指针无法接收对象,因此需要屏蔽this指针,自然静态成员函数也不能访问非静态变量,因为非静态成员变量是由各对象各自管理,如果允许静态函数访问将是十分危险的行为;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值