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; } |