委托构造函数
允许同一个类中一个构造函数调用另一个构造函数,作用:简化变量的初始化。
适用场景
class class_c {
public:
int max_;
int min_;
int middle_;
class_c() {}
class_c(int max) {
max_ = max > 0 ? max : 10;
}
class_c(int max, int min) {
max_ = max > 0 ? max : 10;
min_ = (min > 0 && min < max_) ? min : 1;
}
class_c(int max, int min, int middle) {
//...
}
}
大致是这个意思,上述这种操作可以但没必要–>改用委托构造函数:
class class_c {
public:
int max_;
int min_;
int middle_;
class_c(int max) {
max_ = max > 0 ? max : 10;
}
class_c(int max, int min) : class_c(max) {
min_ = (min > 0 && min < max_) ? min : 1;
}
class_c(int max, int min, int middle) : class_c(max, min) {
middle_ = ...
}
}
注意
上述适用委托构造函数中class_c(int max, int min, int middle)的调用顺序:class_c(int max, int min, int middle) -> class_c(int max, int min) -> class_c(int max) 那这种链式调用的方式就不允许成环。
另外,委托构造函数不能和类成员初始化同时出现(只能用成员赋值来实现)
class class_c{
public:
class_c() {}
class_c(string str) : string_(string) {}
class_c(string str, int num) : class_c(str), num_(num) {} // 不允许这么操作
class_c(string str, int num) : class_c(str) {
num_ = num; //可以
}
}
继承构造函数
即子类直接使用父类的构造函数,
使用场景
class base{
int x;
double y;
string s;
base(int i) : x(i), y(0) {}
base(int i, double j) : x(i), y(j){}
base(int i, double j, const string& str) : x(i), y(j), s(str){}
}
//正确用法
class derive : pubilc base {
derive(int i) : base(i) {}
derive(int i, double j) : base(i, j) {}
...
}
//但是不能什么都不说就直接用,这样的写法就很不礼貌
class derive : public base {
}
...
//使用
derive d(1, 2.5); //如果是那种不礼貌的写法,这里直接会编译报错
原因是c++子类会隐藏父类的同名函数(除非你显示的说明,否则确实不应该调的到,符合design原则,emmm把公屏打在合理上!!!)
继承构造函数的写法:
class derive : public base {
using base::base;
}
这种方式适用于使用父类的同名函数,当然就构造函数而言,这种方式不会去初始化子类新定义的成员变量(合理)