C++ 构造函数漫谈(四)

这一章谈 C++11 中引入的两种 “语法糖” .使用它们可以使得我们的代码更为简洁优雅。

委托构造函数

在同一个类中,一个构造函数可以调用另一个构造函数,这叫委托构造函数。这是 C++ 11 的新特性。
委托构造函数可以简化在每个构造函数中的重复代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B{
public:
B():x_(0),y_(0),z_(0){
//Do something
}
B(int x): B(){
x_ = x;
}

B(int x, int y): B(x){
y_ = y;
}

void DoSomething(){}
private:
int x_;
int y_;
int z_;
};

注意一点,委托构造函数在使用时不可以形成环:禁止套娃。

继承构造函数

在 C++ 中,子类会隐藏父类的 同名 函数.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class B{
public:
void Fun(){}
};

class D: public B{
public:
void Fun(int a){}
};

int main() {
D d;
d.Fun(); //ERROR, 找不到合适的函数
d.B::Fun(); //必须指明
return 0;
}

在 C++11 中,我们可以使用 using BaseClass::FunName 来继承父类的同名函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B{
public:
void Fun(){}
void Fun(char c){}
};

class D: public B{
public:
using B::Fun;
void Fun(int a){}
};

int main() {
D d;
d.Fun(); //OK
d.Fun('c'); //OK
d.Fun(42);
return 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
class B{
public:
B():x_(0),y_(0){}
B(int x):x_(x),y_(0){}
B(int x,int y):x_(x),y_(y){}
private:
int x_;
int y_;
};

class D: public B{
public:
using B::B;
D(int x, int y, int z):B(x,y), z_(z){}
private:
int z_;
};

int main() {
D d;
D d1(1);
D d2(1,1);
D d3(1,1,1);
return 0;
}