C++的构造函数和析构函数(三)构造函数参数初始化列表

构造函数参数初始化列表

  • 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;
}

运行结果
在这里插入图片描述

  • 补充:
    如果函数的声明和实现是分开的,那么初始化列表只能写在函数的实现中,默认参数只能写在函数的声名中(语法层面的知识,记住即可)

猜你喜欢

转载自blog.csdn.net/qq_47329614/article/details/106912929