前言
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
1.成员变量初始化的方式
拿一段AVL树的树节点代码来看看
我们知道初始化类的成员变量,有几种方法
template<class K, class V>
struct AVLTreeNode{
pair<K, V> _kv;
int _bf;
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;
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;
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;
};
优势:
尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,在调用构造函数之前,一定会先使用初始化列表初始化
|