C++类中的成员可以是另一个类的对象,我们称为对象成员
B类中有对象A作为成员,A为对象成员。
当其他类对象作为本类成员,构造时候先构造类对象,在构造自身,
析构的顺序与构造的相反;
静态成员
静态成员就是在成员变量和成员函数前加上关键字Static,称为静态成员
静态成员分为:
静态成员变量
编译器报错(无法解析的外部命令)为链接阶段出现的错误
- 所有对象共享同一份数据
- 编译阶段分配内存(程序运行之前 有代码和全局区(数据区),全局区)
- 类内声明,类外初始化
静态成员变量也是有访问权限的;
静态成员变量的访问方式:
通过对象,通过类名;
静态成员函数
- 所有对象共享同一个函数
- 静态成员函数只能访问静态成员变量
静态成员函数变量也是有访问权限的;
访问方式:
C++对象模型和this指针
成员变量和成员函数分开储存;
静态成员变量和非静态成员函数都不属于类对象上,
只有非静态成员变量才属于类对象上;
空对象占用内存空间为一个字节;
C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占用的位置;
每个空对象也应该有一个独一无二的内存地址;
this指针
this指针概念
每一个非静态成员函数只会生成一份函数实例,也就是说多个同类型的对象会共用一块代码
this指针指向 被调用的成员函数 所属的对象(那个对象调用this指针就指向谁)
this指针是隐含在每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
this指针的用途:
1、当形参和成员变量同名时,可以用this指针来区分;(解决名称冲突)
2、在类的非静态成员函数中返回对象本身,可以使用:return *this
返回的是值 则会创建一个新的对象进行返回,而返回的是一个地址的话则是不会。
空指针访问成员函数
C++中允许空指针调用成员函数,但要注意有没有用到this指针
如果用到了tish指针,则要判断保证代码的健壮性;
const修饰成员函数
常函数:
在成员函数后面加上 const 我们称这个成员函数为常函数;
常函数内不可以修改成员属性
成员属性声明时加关键字 mutable后 在常函数中依然可以修改
常对象:
声明对象前加上const 称该对象为常对象;
常对象只能调用常函数;
函数中不管有没有属性,都会存在一个this指针
而this指针的本质是一个指针常量 指针的指向是不可以修改的;
Person const *this;
在函数后加上const则: 指针的指向 跟 指针的值 都不允许修改;
const Person*const this‘
用mutable关键字,即使在常函数里,也可以修改这个值。