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称该对象为常对象
- 常对象只能调用常函数(因为常函数内不可修改成员属性,而非常函数内可以修改成员属性,如果常对象调用了非常函数,相对于变向修改了成员属性)