目录
构造函数
- 构造函数是特殊的成员函数
- 创建类类型的新对象,系统自动会调用构造函数
- 构造函数是为了保证对象的每个数据成员都被正确初始化
-
函数名和类名完全相同
-
不能定义构造函数的类型(返回类型),也不能使用void
-
通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用
-
构造函数被声明为私有有特殊的用途。(单例模式)
-
构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数(重载)
默认构造函数
不带参数的构造函数,如果程序中未声明,则系统自动产生出一个默认构造函数。如果有其他构造函数,系统将不再提供默认构造函数
重载构造函数
不带参数的构造函数与到参数的构造函数构成重载
构造函数与new
new会分配内存并调用构造函数( 指new表达式)
注意:全局对象的构造先于main函数
析构造函数
- 函数名和类名相似(前面多了一个字符“~”)
- 没有返回类型
- 没有参数
- 析构函数不能被重载
如果没有定义析构函数,编译器会自动生成一个默认析构函数,其格式如下:
类名::~默认析构函数名( )
{
}
默认析构函数是一个空函数。
析构函数与delete运算符
在栈上创建的对象,在生命周期结束的时候会自动调用析构函数
在堆上创建的对象,在生命周期结束的时候要由程序员显示调用delete,delete会调用对象的析构函数释放对象,并释放内存
析构函数可以显式调用
析构函数可以显示调用,但一般不推荐
转换构造函数
- 单个参数的构造函数,将其它类型转换为类类型
- 类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型隐式转换为类类型
Test t(10);//普通构造函数
t=20; //转换构造函数 将20生成一个临时对象 ,将临时对象赋值给t
赋值与初始化区别
在初始化语句中的等号不是运算符。编译器对这种表示方法有特殊的解释
赋值,编译器会默认创建赋值操作,将类的逐个成员进行赋值
Test& Test::operator=(const Test& other);
Test t=10;//等价于Test t(10) 这里的=不是运算符,表示初始化
t=20; //赋值
explicit
只提供给类的构造函数使用的关键字。编译器不会把声明为explicit的构造函数用于隐式转换,它只能在程序代码中显示创建对象
Test t=10 ;//加上explicit之后 这句错误 不能这样创建