C++对象模型和this指针

本文详细阐述了C++中成员变量和函数的组织方式,强调了this指针的作用,包括解决名称冲突和返回对象本身。还讨论了空指针访问成员函数的注意事项以及const修饰成员函数的规则,区分常函数和常对象的概念,以及链式编程的运用。
摘要由CSDN通过智能技术生成

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

成员:所有的变量、函数

在C++中,类内成员变量和成员函数分开存储

只有非静态成员变量才属于类的对象上

只有非静态成员变量A属于对象p上,所以

空对象占用内存空间为1字节

C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置

每个空对象也应该有一个独一无二的内存地址

非空对象所占内存为其包含的数据占有的内存

2、this指针

this指针指向被调用成员函数所属的对象

  • this指针是隐含每一个非静态每一个非静态成员函数的指针
  • this指针不需要定义,直接使用即可

this指针的用途

  • 当形参和成员变量同名时,可用this指针来区分(解决名称冲突)
  • 在类的非静态成员函数中返回对象本身,可使用return *this(返回对象本身)
a.解决名称冲突:

编译器将阴影的三个age看作同一个变量,从未将年龄赋值到属性的age上

解决方法:
1.将成员属性和传入的参数规范

2.利用this指针

this指针指向被调用成员函数所属的对象

这里this指针指向的是p1

b.返回对象本身

将p1的年龄加到p2身上

如想要将p2的年龄连续加几次则会报错

因为test02返回的是一个void

若要实现追加年龄,应该将p2返回

链式编程思想

this是指向p2的指针,而*this指向的就是p2这个对象本体

如果利用引用的方式返回只有一个p2,如果用值的方式返回,会拷贝出若干个p2

3、空指针访问成员函数

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

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

非静态成员变量在对象创建后才有效,这里创建的对象*p为空,非静态成员变量无效

解决:加一个指针是否为空的判断

4、const修饰成员函数

常函数:

  • 成员函数后加const关键字我们称这个函数为常函数
  • 常函数内不可修改成员属性
  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改

this指针的本质是指针常量 指针的指向是不可以修改的

在成员函数后面加const,修饰的是this指针,让指针指向的值也不可以修改

在成员p调用showPerson函数时this指针已经指向了p所以不可再修改this指针指向的值

如要要修改常函数中的某些值,在属性前加mutable关键字,加了之后在常对象和常函数中都可以修改该值

常对象:

  • 声明对象前加const称该对象为常对象
  • 常对象只能调用常函数(因为常函数内不可修改成员属性,而非常函数内可以修改成员属性,如果常对象调用了非常函数,相对于变向修改了成员属性)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值