1 构造函数
在类对象创建时,自动调用,完成类对象的初始化。尤其是动态堆内存的申请。
- 在对象创建时自动调用,完成初始化相关工作
- 无返回值,与类名同
- 可以重载,可默认参数
- 默认无参构造函数,一经实现,默认不复存在
2 参数初始化列表
- 只能用于类的构造函数。
- 初始化列表中的初始化顺序,与声明顺序有关,与前后赋值顺序无关
- 必须用此格式来初始化非静态const数据成员(const int c;)
- 必须用此格式来实始化引用数据(int& b)
3 析构函数
在类对象销毁时,自动调用,完成对象的销毁,尤其是类中己申请的堆内存的释放。
- 对象销毁时,自动调用,完成销毁的善后工作
- 无返值,与类名同,无参,不可以重载与默认参数
- 系统提供默认空析构器,一经实现,不复存在
4 构造函数
4.1 委托构造函数
- 委托构造函数允许在同一个类中一个构造函数调用另外一个构造函数,可以在变量初始化时简化操作
4.2 继承构造函数
- 继承构造函数可以让派生类直接使用基类的构造函数,如果有一个派生类,希望派生类采用和基类一样的构造方式,可以直接使用基类的构造函数,而不是再重新写一遍构造函数
4.3 深拷贝和浅拷贝
- 浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间
- 深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针
4.4 拷贝构造函数
- 系统提供默认的拷贝构造器,一经实现,不复存在。(不完全正确)
- 系统提供的是等位拷贝,也就是所谓的浅拷贝。
- 要实现深拷贝,必须要自定义。
- 拷贝构造发生的时机
- 制作对象的副本
- 以对象作为参数和返回值
4.5 赋值构造函数
- 当一个类的对象向该类的另一个对象赋值时,就会用到该类的赋值函数
- 当没有重载赋值函数(赋值运算符)时,通过默认赋值函数来进行赋值操作
- 强调:这里a,b对象是已经存在的,是用a 对象来赋值给b的!!
4.6 拷贝构造函数和赋值构造函数的区别
拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,而赋值函数是对于一个已经被初始化的对象来进行赋值操作
一般来说在数据成员包含指针对象的时候,需要考虑两种不同的处理需求:一种是复制指针对象,另一种是引用指针对象。拷贝构造函数大多数情况下是复制,而赋值函数是引用对象
- 实现不一样。拷贝构造函数首先是一个构造函数,它调用时候是通过参数的对象初始化产生一个对象。赋值函数则是把一个新的对象赋值给一个原有的对象,所以如果原来的对象中有内存分配要先把内存释放掉,而且还要检察一下两个对象是不是同一个对象,如果是,不做任何操作,直接返回。
5 const修饰符
在类中:
- 修饰成员变量:
- 只能在初始化列表中赋值
- 不能被修改
- 可以被const和非const成员函数调用
- 修饰成员函数
- 在本函数内部不会修改类内的数据成员,不会调用其它非const成员函数
- 修饰函数放在声明之后,实现体之前
- const 构成函数的重载
- 如果const构成函数重载,const对象只能调用const函数,非const对象优先调用非const函数
- const函数只能调用const函数。非const函数可以调用const函数
- 类体外定义的const成员函数,在定义和声明处都需要const修饰符
其它
- 常对象 ( className a; )
- const 对象,只能调用 const 成员函数
- 可访问 const 或非 const 数据成员,不能修改
6 static修饰符
修饰成员变量
- static 成员变量实现了同簇类对象间信息共享。
- static 成员类外存储,求类大小,并不包含在内。
- static 成员是命名空间属于类的全局变量,存储在 data 区 rw 段。
- static 成员使用时必须实始化,且只能类外初始化。
- 可以通过类名访问(无对象生成时亦可),也可以通过对象访问。
修饰成员函数
- 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员, 完成对静态数据成员的封装。
- 静态成员函数只能访问静态数据成员。原因:非静态成员函数,在调用时 this指 针时被当作参数传进。而静态成员函数属于类,而不属于对象,没有 this 指针。
