【C++】谈谈初始化列表

前言

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

1.成员变量初始化的方式

拿一段AVL树的树节点代码来看看

我们知道初始化类的成员变量,有几种方法

  • 在构造函数内部初始化
template<class K, class V>
struct AVLTreeNode{
    
    
	pair<K, V> _kv;
	int _bf; // balance factor = h(subRight) - h(subLeft)
	AVLTreeNode<K, V>* _parent;
	AVLTreeNode<K, V>* _left;
	AVLTreeNode<K, V>* _right;
	
AVLTreeNode(const pair<K, V>& kv) {
    
    
	_kv = kv;
	_bf = 0;
	_parent = nullptr;
	_left = nullptr;
	_right = nullptr;
};
  • 给缺省值
template<class K, class V>
struct AVLTreeNode{
    
    
	pair<K, V> _kv = kv;
	int _bf = 0; // balance factor = h(subRight) - h(subLeft)
	AVLTreeNode<K, V>* _parent = nullptr;
	AVLTreeNode<K, V>* _left = nullptr;
	AVLTreeNode<K, V>* _right = nullptr;

	AVLTreeNode(const pair<K, V>& kv)
	{
    
    }
};
  • 初始化列表
```cpp
template<class K, class V>
struct AVLTreeNode{
    
    
	pair<K, V> _kv;
	int _bf; // balance factor = h(subRight) - h(subLeft)
	AVLTreeNode<K, V>* _parent;
	AVLTreeNode<K, V>* _left;
	AVLTreeNode<K, V>* _right;

	AVLTreeNode(const pair<K, V>& kv)
		:_kv(kv)
		,_bf(0)
		,_parent(nullptr)
		,_left(nullptr)
		,_right(nullptr)
	{
    
    }
};

2.初始化列表的注意点、优势

1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

2.类中包含以下成员,必须放在初始化列表位置进行初始化:

  • 引用成员变量
  • const成员变量
  • 自定义类型成员(该类没有默认构造函数)
class A
{
    
    
public:
	A(int a)
		:_a(a)
	{
    
    }
private:
	int _a;
};
class B
{
    
    
public:
	B(int a, int ref)
		:_aobj(a)
		,_ref(ref)
		,_n(10)
	{
    
    }
private:
	A _aobj; // 没有默认构造函数
	int& _ref; // 引用
	const int _n; // const
};

优势:

尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,在调用构造函数之前,一定会先使用初始化列表初始化

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_52640673/article/details/123219988
今日推荐