对象初始化和清理
初始化列表
类对象作为类成员
先构造类成员,再构造自身;
先析构自身,再析构类成员
静态成员
静态成员变量
同一份内存
两种访问方式
访问权限【类外不可访问private】
静态成员函数
共享函数
只能访问静态成员变量
静态成员函数访问权限
C++对象模型和this指针
成员变量与成员函数内存占用
编译器会给每个空对象分配一字节空间【区分不同空对象的地址位置】
不是空的对象,不用额外花一个字节
静态成员不属于任何一个对象,不占对象内存
非静态成员函数不会占用内存空间【能区分不同对象的各函数】
静态成员函数不会占用内存空间
this指针
解决名称冲突
返回对象本身【*this】
【如果下面不是Person &而是Person,即返回值,那这个值就不是p2本身】
空指针访问成员函数
访问成员变量【this是空指针(m_age ==> this->m_age)】
const修饰成员函数
常函数
变量前加了mutable就可以修改该变量
常对象
友元
全局函数做友元
类做友元
【蓝框部分新知识点:类外写成员函数】
成员函数做友元
【Building类由于要事先将goodGay中的函数设置为friend,因此goodGay要在Building前定义】
【因为goodGay中有Building,因此Build声明在goodGay前】
【Building的构造函数定义要在goodGay的构造函数定义前(goodGay构造时会调用Build的构造),蓝框部分展示】
运算符重载
加\减号运算符(+\-)重载
成员函数重载
全局函数重载
函数重载
左移运算符(<<)重载
【cout属于ostream对象】
【链式传递】
友元权限设置【一般类中成员变量都是私有private】
递增\减运算符(++\--)重载
前置递增
错误示例【返回引用的类型,而不是返回值,是因为有++(++myint)的情况,这种情况下最左边的++是对一个值(如果返回的是值)++】
正确示例
后置递增
赋值运算符(=)重载
直接=都是浅拷贝
【即面对指针类型的变量,只能做到复制地址,不能单独创建一个内存空间】
【当指向的内存空间释放后,另一个变量将丢失了该数据(成了野指针)】
正确示例
关系运算符(==、!=、!、<、>)重载
函数调用运算符【()】重载
该方法使用起来类似于函数,因此也称为仿函数