委托构造函数&&继承构造函数

委托构造函数

允许同一个类中一个构造函数调用另一个构造函数,作用:简化变量的初始化。

适用场景

class class_c {
 publicint 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;
}

这种方式适用于使用父类的同名函数,当然就构造函数而言,这种方式不会去初始化子类新定义的成员变量(合理)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值