C++对象模型和this指针

C++中,类的成员变量和成员函数分开存储,非静态成员变量属于类对象,静态成员不占用类对象空间。每个空对象会分配1字节内存以确保唯一地址。this指针用于在非静态成员函数中标识调用对象,解决名称冲突并允许链式调用。常函数不可修改成员属性,但mutable关键字可例外。常对象只能调用常函数。
摘要由CSDN通过智能技术生成

在C++中,类内的成员变量和成员函数分开存储。只有非静态成员变量才属于类的对象上。

  1. 空对象

空对象占用内存空间为:1字节,且内存空间地址唯一

C++编译器会给每个空对象分配一个字节的空间,是为了区分空对象占内存的位置。例如,p1和p2都是空对象,但是p1和p2不可能使用同一块内存空间,这个字节就是为了区分空对象占内存的位置。每个空对象都应该有一个唯一的内存地址。

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

  1. 非静态成员变量属于类对象上,占4个字节大小的内存

  1. 静态成员变量不属于类对象上,占4个字节大小的内存。

还是4字节,说明不在类上。如果在的话,会比4个字节大。

  1. 非静态成员函数不属于类对象上,占4个字节大小的内存。

  1. 静态成员函数不属于类对象上,占4个字节大小的内存。

  1. 总结:只有非静态变量属于类的对象上,静态变量、静态函数、非静态函数都不属于。

  1. this指针

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么这一块代码是如何区分那个对象调用自己的呢?

c++通过提供特殊的对象指针,this指针,解决上述问题。

  1. this指针

this指针指向被调用的成员函数所属的对象。this指针是隐含每一个非静态成员函数内的一种指针。this指针不需要定义,直接使用即可。

  1. this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分——解决名称冲突

  • 在类的非静态成员函数中返回对象本身,可使用return *this——返回对象本身用*this

2.1 形参和成员变量同名时

此时形参和成员变量同名了,三个灰色的weight是形参,高亮weight是成员变量。这时编译器无法正确传入参数。

首先可以规范取名来区分

其次,采用this指针来区分

test1中使用有参构造函数Person创建了对象p1,那么this就指向p1被调用的成员函数Person所属的对象p1,也就是说p1调用Person,那么this就指向p1。

2.2 返回对象本身用*this

一次追加
多次追加

返回值类型是void时

解释:

此时SalaryAddsalary是void类型是,“s2.SalaryAddsalary(s1).SalaryAddsalary(s1).SalaryAddsalary(s1).SalaryAddsalary(s1);“

这个写法报错的原因是:SalaryAddsalary函数的返回值是void,也就是s2.SalaryAddsalary(s1)的返回值是void,已经不能再继续调用这个SalaryAddsalary函数了。只有在s2.SalaryAddsalary(s1)的返回值是与s2同类型,即Salary类型时,才可以继续调用SalaryAddsalary这个函数。

如果像继续调用,即返回值是s2本身的话就可以继续追加工资,比如下图展示这样,那么需要使用*this返回其本身。

返回值用*this,引用传递

这种方式就是链式编程思想,比如cout后面的”<<“,一直追加

返回值用*this,值传递

用值传递的方式返回,相当于调用了拷贝构造函数,拷贝了新的数据,也就是Salary和自身this是不一样的数据。按照自身this拷贝了新的数据Salary作为返回值。

  1. 空指针

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针。

如果用到this指针,需要加以判断保证代码的健壮性。

  1. const修饰成员函数

  1. 常函数:

  • 成员函数后加const后我们称为这个函数为常函数

  • 常函数内不可以修改成员属性;

  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改。

解释为什么”this->mA = 100;”和“this = NULL;”都会报错

  • 首先,明确每个成员函数都隐含了一个this指针,”mA = 100”; 相当于” this->mA = 100;”;

  • 然后,this指针的本质是一个指针常量,指针的指向不可修改,即 “Person* const this;“。当test1用Person创建一个对象p,p调用ShowPerson这个函数时,这个this只能指向对象p,不可以指向其他,比如”this = NULL;”,因为this指针是一个指针常量。

  • 但是,this指针指向的对象的数据是可以修改的,也就是mA的值是可以修改的。

  • 如果想让this指针指向的对象也不能修改,需要声明常函数,就是在this指针前再加一个const,即const Person* const this。

如果想在常函数中,也可以修改某个成员变量时,需要在这个成员变量前加关键字mutable,如mB。

  1. 常对象:

  • 声明对象前加const称该对象为常对象;

  • 常对象只能调用常函数。

常对象不能调用常函数,常对象是不能修改属性的;

普通函数是可以修改普通普通成员变量的;

如果可以调用这个普通函数,那么就可以修改普通成员变量mA了,矛盾。

黑马老师-const修饰成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值