这一章谈 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){ } 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(); 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(); d.Fun('c'); 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; }
|