委托构造函数:
使用了其他构造函数来完成全部构造工作的函数,减少冗余代码的工作量。
class Test
{
public:
Test(int max)
{
this->m_max = max > 0 ? max : 100;
}
Test(int max, int min):Test(max)
{
this->m_min = min > 0 && min < max ? min : 1;
}
Test(int max, int min, int mid):Test(max, min)
{
this->m_middle = mid < max&& mid > min ? mid : 50;
}
int m_min;
int m_max;
int m_middle;
};
其与在构造函数里调用其他构造函数的不同:
区别总结
-
语法和用法不同: 委托构造函数通过成员初始化列表直接调用另一个构造函数,不需要构造函数体内的代码,更为简洁和直接。而在构造函数内部调用其他构造函数则需要在函数体内明确调用其他构造函数或者其它初始化代码。
-
代码风格和可读性: 委托构造函数通常更清晰和易读,因为初始化过程集中在初始化列表中;而在构造函数内部调用其他构造函数则可以在构造函数体中执行更复杂的逻辑,但可能会使构造函数变得更加复杂和冗长。
-
C++ 标准的要求: 委托构造函数是 C++11 标准引入的新特性,而在构造函数内部调用其他构造函数则是更早期就可以使用的技术。
继承构造函数:就是使用using关键词来继承父类的函数。因为普通函数是可以继承的,但是构造函数子类除了使用初始化列表以外就是使用using关键字。
class Base
{
public:
Base(int i) :m_i(i) {}
Base(int i, double j) :m_i(i), m_j(j) {}
Base(int i, double j, string k) :m_i(i), m_j(j), m_k(k) {}
void func(int i)
{
cout << "base class: i = " << i << endl;
}
void func(int i, string str)
{
cout << "base class: i = " << i << ", str = " << str << endl;
}
protected:
int m_i;
double m_j;
string m_k;
};
class Child : public Base
{
public:
using Base::Base;
using Base::func;
void func()
{
cout << "child class: i'am luffy!!!" << endl;
}
};
int main()
{
Child c1(1);
Child c2(1, 1.2);
Child c3(1, 1.2, "hello");
c3.func(1, "hello");
return 0;
}
这里的Chlid并没有构造函数,但是其可以利用父类的构造函数,由于其本身没有成员变量,所以利用继承构造函数初始化父类的protected(对子类可见)成员变量是没有问题的。但是using Base::func;这句话有些多余,因为无论如何子类是会继承父类的公有函数的。即使删掉这句话也是可以的。