22、委托构造函数和继承构造函数
0、课前秀
1、委托构造函数
-
委托构造函数:允许在同一个类中一个构造函数可以调用另外一个构造函数,从而可以在初始化时简化变量的初始化。
-
没有用构造函数的场景(无实际意义)
class class_c{
public:
int max;
int min;
int middle;
class_c {}
class_c(int my_max){
max = my_max > 0 ? my_max : 10;
}
class_c(int my_max, int my_min){
max = my_max > 0 ? my_max : 10;
min = my_min > 0 && my_min < max ? my_min : 1;
}
class_c(int my_max, int my_min, int my_middle){
max = my_max > 0 ? my_max : 10;
min = my_min > 0 && my_min < max ? my_min : 1;
middle = my_middle < max && my_middle > min ? my_middle : 5;
}
};
- 委托构造函数的写法
class class_c{
public:
int max;
int min;
int middle;
class_c(int my_max){
max = my_max > 0 ? my_max : 10;
}
class_c(int my_max, int my_min):class_c(my_max) {
min = my_min > 0 && my_min < max ? my_min : 1;
}
class_c(int my_max, int my_min, int my_middle):class_c(my_max,my_min){
middle = my_middle < max && my_middle > min ? my_middle : 5;
}
};
int main()
{
class_c c1{1,3,2};
}
- 使用委托构造函数需要注意:使用了代理构造函数就不能用类成员初始化了。
class class_a{
public:
class_a(){}
//member initialization here, no delegate
class_a(string str):m_string(str){}
//调用了委托构造函数,不能用类成员初始化了
//error C3511: a call to a delegating constructor shall be the only member-initializer
class_a(string str, double dbl):class_a(str),m_double(dbl){}
//只能通过成员赋值来初始化
class_a(string str, double dbl):class_a(str){m_double = dbl;}
double m_double{1.0};
string m_string;
};
2、继承构造函数
- 可以让派生类直接使用基类的构造函数,而无须自已再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派s生类构造函数的编写
struct 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){}
}
//直接派生,会报错
struct Derived1 : Base
{
};
int main()
{
Derived1 d(1,2.5,"ok"); //编译错误,没有合适的构造函数
}
//在派生类中定义构造函数
struct Derived2 : Base
{
Derived2(int i):Base(i) {}
Derived2(int i, double j):Base(i,j) {}
Derived2(int i, double j, const string& str):Base(i,j,str) {}
};
int main()
{
int i = 1;
double j = 1.23;
Derived2 d(i);
Derived2 d1(i,j);
Derived2 d2(i,j,"");
return 0;
}
struct Derived : Base
{
using Base::Base; //声明使用基类构造函数
};
int main()
{
int i = 1;
double j = 1.23;
Derived d(i); //直接使用基类构造函数来构造派生类对象
Derived d1(i,j);
Derived d2(i,j,"");
return 0;
}
ReadMe
- 20200508看完第一版,《深入应用C++11》