定义如何对类类型成员进行初始化的成员函数称为构造函数
构造函数的名字与类的名字相同,并且不能指定返回类型!(没有return语句)
默认构造函数:因为它是"默认"运行的,如果没有提供初始化式,那么就会使用默认构造函数,不管变量在哪里定义,默认构造函数都会被使用。为所有形参提供默认实参的构造函数也定义了默认构造函数
有的类有默认构造函数,如string类定义了默认构造函数来初始化string变量为空字符串,即没有字符的字符串。
如string s; //这时候字符串s为空串s=""
有些类类型没有默认构造函数,对这些类,必须显式的初始化
构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数。构造函数的工作是保证每个对象的数据成员具有合适的初始值。构造函数可以没有形参也可以有多个形参。构造函数可以被重载,一个类的构造函数的数量没有限制
构造函数初始化列表:
对类
class Person
{
Public:
......
Private:
string name;
string adress;
int age;
}
以一个冒号开始,接着是一个逗号分隔的数据成员列表,每个数据成员后面跟着一个房子圆括号中的初始形式
Person(const int &ag):age(ag),name("Tom"),adress("NanJing"){ } //别忘了后面的大括号
也可以写成:
Person(const int &ag)
{
age=ag;
name="Tom";
adress="NanJing";
}
实参决定使用哪个构造函数,编译的时候会自动完成调用
只要创建该类型的一个对象,编译器就运行一个构造函数
const 构造函数是不必要的,因为构造函数的工作是初始化对象,不管对象是不是const,都用一个构造函数来初始化该对象
另外初始化const或引用类型数据成员的唯一的机会是在构造函数初始化列表中,即第一种方式下,第二种中不能直接对const赋值
构造函数初始化列表仅指定用于初始化成员的值,而不指定初始化成员的执行次序,成员被初始化的次序就是定义成员的次序。对上面的类来说name先初始化,adress和age再初始化(按定义的顺序来)
在构造函数中使用默认实参可以减少代码重复
只有当一个类没有定义构造函数的时候,编译器才会自动的生成一个默认构造函数
类通常应定义一个默认构造函数
合成的默认构造函数(synthesized default constructor)使用与变量初始化相同的规则来初始化成员,具有类类型的成员通过运行各种的默认构造函数来进行初始化,当对象定义在局部作用域中时,内置或复合类型的成员不进行初始化