一、构造函数
1.每个类都定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数称为构造函数,只要类的对象被创建,就会执行构造函数
2.构造函数没有返回类型;构造函数不能被声明成const的,当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正获取const性质
3.类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数,这个函数无需任何实参。编译器创建的构造函数又称为合成的默认构造函数,规则如下:如果存在类内的初始值,用它来初始化成员,否则默认初始化该成员(0、空串)
struct date
{
int x = 520;
string s;
};
4.某些类不能依赖于合成的默认构造函数,原因有三:
(1).编译器在发现类不包含任何构造函数的情况下才会生成默认的构造函数,如果定义了几个类,但其中一个用了其他的构造函数,其他类将没有默认的构造函数
(2).合成的默认构造函数可能执行错误的操作,例如定义在块内的内置类型、复合类型(数组、指针)被默认初始化时他们的值时未定义的
(3).有时编译器不能为某些类合成默认的构造函数
5.构造函数有如下写法:
(1).在c++11中,如果我们可以用这种方式生成默认的构造函数,在类内声明,则默认构造函数时内联的,在类外部不是内联的
struct date
{
date() = default;
int x = 520;
string s;
};
(2).如果编译器不支持类内初始化,就需要构造函数初始值列表来初始化,在定义对象时需要加列表初始化
struct date
{
date() :x(1) {}
date(const string& ss) :s(ss) {}
date(const string& ss, int price) :x(price), s(ss) {}
int x = 520;
string s;
};
struct date
{
date(const string& ss) :s(ss) {}
int x = 520;
string s;
};
int main()
{
date node("c++good");
}
6.在类外部定义构造函数
二、拷贝、赋值和析构
1.除了定义类的对象如何初始化之外,类还需要拷贝赋值和销毁对象时发生的行为。如果不主动定义这些操作,编译器则替我们合成它们,不过对某些类来说,合成的版本无法正常工作。