C++ 构造函数漫谈(四)
这一章谈 C++11 中引入的两种 “语法糖” .使用它们可以使得我们的代码更为简洁优雅。
委托构造函数
在同一个类中,一个构造函数可以调用另一个构造函数,这叫委托构造函数。这是 C++ 11 的新特性。
委托构造函数可以简化在每个构造函数中的重复代码。
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++ 中,子类会隐藏父类的 同名 函数.
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 来继承父类的同名函数。
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;
}
这种用法对一个类的构造函数同样适用。
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;
}