blueyi's notes

Follow Excellence,Success will chase you!

0%

C/C++拾遗之类成员含引用变量

1.首先明确当类中含有引用类型的成员变量时,编译器会将所有合成的默认构造函数都定义为delete,也就是说编译器将不会合成任何构造函数,所有构造函数必须由用户显式地定义,且该引用变量必须在所有定义的构造函数初始化列表中直接初始化,而不能在构造函数中初始化,形参也必须是引用类型。

2.分析以下代码,注释部分(编译环境g++5.1.0):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>

using namespace std;
class A {
public:
A(int i=3) : m_i(i){}
void print() { cout << "m_i=" << m_i << endl; }
private:
int m_i;
};
class B {
public:
//如果有以下两行时都将报错未初始化的引用变量,因为当含有引用类型的成员时,必须在初始化列表中对该成员进行直接初始化
// B(){}
// B(A& a) { m_a = a; }

B(A& a) : m_a(a) {}
void display() { m_a.print(); }
private:
A& m_a; //引用类型的变量
};
int main(void)
{
A a(5);
B b(a);
b.display();
B b2(a);

//如果有以下这行将报错使用了delete function,因为由于B中含有引用变量,编译器并不会合成默认的赋值运算符
// b = b2;
return 0;
}

3.用处:例如当有两个类要对第三个类的数据进行共享处理时,可以考虑将第三个类作为这两个类的引用类型的成员变量。

Welcome to my other publishing channels