内容学习自:爱编程的大丙
一、委托构造函数
委托构造函数允许使用同一个类中的一个构造函数地啊哟用其他的构造函数,从而简化相关变量初始化。下面举例说明
class test13
{
public:
test13() {};
test13(int max)
{
this->m_max = max > 0 ? max : 100;
}
test13(int max, int min) :test13(max)
{
this->m_min = min > 0 && min < max ? min : 1;
}
test13(int max, int min, int mid) :test13(max, min)
{
this->m_middle = mid < max&& mid > min ? mid : 50;
}
int m_min;
int m_max;
int m_middle;
};
void main()
{
test13 t(90, 30, 60);
cout << "min: " << t.m_min << ", middle: "
<< t.m_middle << ", max: " << t.m_max << endl;
}
?这里是一个链式调用,就是第三个调用第二个,第二个调用了第一个
- 这种链式的构造函数调用不能形成一个闭环(死循环),否则会在运行期抛异常。
- 如果要进行多层构造函数的链式调用,建议将构造函数的调用的写在初始列表中而不是函数体内部,否则编译器会提示形参的重复定义
- 并且在这个链中不能重复给同样的变量初始化
二、继承委托构造
之前98版本要自己重写构造,11以后可以使用基类的。之前需要在子类中重新定义和基类一致的构造函数,看看以前是怎么写的
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) {}
int m_i;
double m_j;
string m_k;
};
class Child : public Base
{
public:
Child(int i) :Base(i) {}
Child(int i, double j) :Base(i, j) {}
Child(int i, double j, string k) :Base(i, j, k) {}
};
现在可以使用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) {}
int m_i;
double m_j;
string m_k;
void print(){cout<<"nihaoya"<<endl}
};
class Child : public Base
{
public:
using Base::Base;
using Base::print;
void print(){cout<<"sawadika"<<endl;}
};
另外,也可以使用using 基类::函数名;实现使用基类被覆盖的函数。
|