C++初阶——构造函数的初始化列表

前言:C++中,初始化列表是构造函数中极为重要的一部分,是每个成员变量定义的地方。

一.什么是初始化列表

初始化列表是每个成员变量定义的地方。不管我们有没有写,成员变量都要走一遍初始化列表。
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。

#include<iostream>
using namespace std;
class A {
    
    
public:
	A()  //构造函数中的初始化列表
		:_a(10)
		,_b(20)
	{
    
    
		cout << "A()" << endl; 
	}
	void print()
	{
    
    
		cout << "_a = " << _a << endl;
		cout << "_b = " << _b << endl;

	}
private:
	int _a; // 注意,这里仅为声明,不是定义的地方。
	int _b;
};
int main()
{
    
    
	A a;
	a.print();
	return 0;
}

控制台输出如下:
在这里插入图片描述
由上图可以看出,实例化对象a调用了构造函数,初始化列表中的值也赋给了对应的成员变量。

但是这样的话并没有看出初始化列表的价值呀,因为我完全可以在构造函数中写成赋值形式,比如下面这样:输出结果是一样的。

A()  //构造函数
{
    
    
	_a = 10;
	_b = 20;
	cout << "A()" << endl; 
}

二.何时用初始化列表

类中出现以下成员,必须放在初始化列表位置(定义时)进行初始化:
1.const成员变量
2.引用成员变量
3.自定义类型成员变量(且没有可用默认构造函数)

以const成员变量举例:
在这里插入图片描述

前面说过,初始化列表是成员变量定义的地方,而const赋值必须在定义的地方初始化,因此给const变量赋值可以借助初始化列表:

#include<iostream>
using namespace std;
class A {
    
    
public:
	A()
		:_b(20)  //初始化列表初始化_b
		,_a(10)
	{
    
    
		cout << "A()" << endl; 
	}
	void print()
	{
    
    
		cout << "_a = " << _a << endl;
		cout << "_b = " << _b << endl;

	}
private:
	int _a;
	const int _b;   //const成员变量
};
int main()
{
    
    
	A a;
	a.print();
	return 0;
}

声明处赋值——缺省值

有时可能遇到在声明处赋值的情况:必须知道,这里的是声明,不是定义,定义是在初始化列表完成的。这里给的实际上是缺省值,就像缺省参数一样:
如果初始化列表显示给值了,则用初始化列表的值。
如果初始化列表没有显示给值,则用缺省值。

#include<iostream>
using namespace std;
class A {
    
    
public:
	A()
		:_a(100)  // 显示给值
	{
    
    
		cout << "A()" << endl; 
	}
	void print()
	{
    
    
		cout << "_a = " << _a << endl;
		cout << "_b = " << _b << endl;

	}
private:
    //必须知道,这里的是声明,不是定义。
	int _a = 10; //这里给的实际上是缺省值,就像缺省参数一样。
	const int _b = 20;  //const成员变量
};
int main()
{
    
    
	A a;
	a.print();
	return 0;
}

控制台输出如下:_a显示给值,输出100,_b没有,输出的是缺省值20
在这里插入图片描述

三.注意点

1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2.初始化列表是按照成员变量声明的顺序初始化的。
3.再次强调,类中出现以下成员,必须放在初始化列表位置(定义时)进行初始化:
const成员变量,引用成员变量,自定义类型成员变量(且没有可用默认构造函数)

文末BB:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给博主点点赞和关注.
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_73390155/article/details/132342359