构造函数参数初始化列表
- C++中提供了一种新的初始化成员变量的方法,那就是对象初始化列表;使用方法是在函数首部和函数体之间加一冒号,后面紧跟要初始化的参数,如下所示
class Test {
public:
int m_a;
int m_b;
Test(int a, int b) :m_a(a), m_b(b) { }
};
上面的代码与下面两种写法等价
class Test {
public:
int m_a;
int m_b;
Test(int a, int b){
this->m_a = a;
this->m_b = b;
}
};
class Test {
public:
int m_a;
int m_b;
Test(int a, int b) {
m_a = a;
m_b = b;
}
};
-
那为什么要引入参数初始化列表呢?
假如存在这么一种情况:在类A中,只有一个带2个参数的构造函数,类B中有类A的一个对象,但是类B没有定义构造函数,所以B类中有一个默认的无参的构造函数。所以在编译时会报 " A:没有合适的默认构造函数可用 " 的错误,原因是类B中有A的对象,而类 A不支持无参构造,所以类B不能无法初始化类A的对象。而参数初始化列表就可以解决这种情况,而对于其他两种都不能解决这种情况
-
说明几点:
1、初始化列表只能用在构造函数中
2、初始化的顺序只跟成员变量的声明顺序有关,与初始化列表的排列顺序无关
3、初始化 const 成员变量的唯一方法就是使用参数列表初始化
初始化列表与默认参数配合使用
class Person {
public:
int m_age;
int m_height;
Person(int age = 0, int height = 0) :m_age(age), m_height(height) {
printf("m_age=%d,m_height=%d\n",age,height);
}
};
int main() {
Person person1;
Person person2(18);
Person person3(18, 180);
getchar();
return 0;
}
运行结果
- 补充:
如果函数的声明和实现是分开的,那么初始化列表只能写在函数的实现中,默认参数只能写在函数的声名中(语法层面的知识,记住即可)