class A { public: int a; int b; int c;
//默认构造函数 }; int main() {
A a ;
A e { }; A f ( ); //不行 A c {1,2}; A d {1,2,3}; }
当对象的数据成员是public,在创建对象时可以在初始化列表中指定他们的值。
class A { public: int a; int b; int c; A(int d,int e,int f) {} //有参构造函数 }; int main() { A c1 {1,2}; //no instance of constructor "A::A" matches the argument list;
A c2 {1,2,3}; A c3 (1,2); //no instance of constructor "A::A" matches the argument list; A c4 (1,2,3);
A c5; //no default constructor exists for class "A"
}
注意调用构造函数完全不同于包含公共数据成员值的初始化列表中提供的语句,而此处初始化列表包含构造函数的实参,有三个形参,所以初始化列表中必须有三个值。
A c5;出错的原因是类缺少默认构造函数,默认构造函数被抑制了,需要自己重新定义。
当已经存在带形参的构造函数,如果我们仍然希望声明没有初始化列表的对象,那么必须在自己的类中添加 默然构造函数的定义。
可以如下方式添加默认构造函数:
A()=default;
A(){}
class A { public: int a ; int b ; int c ; A(int d = 1, int e = 1, int f = 1) {} //含有默认值的构造函数 ~A(){}; }; int main() { A a; A b; A e{}; A c1{1,2}; A c2{ 1,2,3}; A c3( 1,2,3); A c4( 1,2); A d{}; }
对于含有默认值的构造函数,就是默认构造函数,下面都一样
A()=default;
A(){}
A(int d = 1, int e = 1, int f = 1) {}
在构造函数中使用初始化列表
在构造函数头用初始化列表初始化数据成员,比使用赋值语句效率高,初始化列表总是在函数体之前执行,
所以可以在构造函数中使用已初始化的数据成员
A(int d = 1, int e = 1, int f = 1) :a{ d }, b{ e }, c{ f } {} //使用初始化列表初始化数据成员
A(int d = 1, int e = 1, int f = 1) //使用赋值语句初始化数据成员
{ a=d; b=e; c=f; }
构造函数必须使用初始化列表的地方
- const 常量类型成员
- &引用类型成员
对于const和引用类型成员,只能使用成员初始化列表,不能再构造函数中使用赋值语句初始化。
另外成员初始化顺序不同于在构造函数中的初始化列表中的顺序,而与在类定义中的顺序相同。