1.构造函数
1.委托构造函数:允许同一个类的构造函数调用其他构造函数,简化变量初始化
class BB
{
public:
BB() {}
BB(int max) {
this->m_max = max > 0 ? max : 100;
cout << "max = " << this->m_max << endl;
}
BB(int max,int min):BB(max) {
this->m_min = min > 0 && min < max ? min : 1;
cout << "min = " << this->m_min << endl;
}
BB(int max ,int min ,int mid) :BB(max,min){
this->m_mid = mid > min && mid < max ? mid : 100;
cout << "mid = " << this->m_mid << endl;
}
int m_max;
int m_min;
int m_mid;
};
不能形成闭环,只能形成链路
只能使用初始化成员列表的方式调用,否则编译器会报错(形参的重定义)
在初始化列表中调用委托构造函数初始化某个参数后,就不能在成员初始化列表中再初始化这个参数
2.继承构造函数:子类可以直接继承父类的构造函数
父类的构造函数不能是默认构造函数、拷贝构造函数、移动构造函数
继承的构造函数只能初始化父类的成员变量,不能初始化子类的成员变量
父类的构造函数时私有的或者子类的构造函数是虚继承时,不能继承构造函数
使用继承构造,编译器不会为子类添加默认构造函数
class BBB :public BB
{
public:
using BB::BB;//子类可以使用父类的所有构造函数
using BB::func;//子类可以使用父类隐藏的函数
void func() {
cout << " BBB func = " << endl;
}
};
2.final
final可以修饰函数与类,放在函数或者累后面。
final修饰函数时,只能修饰虚函数(阻止子类重写父类的这个函数)
final修饰类时,防止类被继承(派生子类)
virtual不能与final同时出现
3.override
保证派生类中申明的重写函数与基类中的虚函数有相同的函数名,同时明确会重写基类的虚函数,保证重写虚函数的正确性。
4.初始化列表{}
对象\变量\指针 {} 对象\变量\指针 = {}
聚合类型可以使用初始化列表相当于给每个元素分别赋值;对于非聚合类型,则需要定义一个合适的构造函数,此时使用初始化列表会调用它对应的构造函数。
聚合类:
普通数组可以看做一个聚合体
无基类、无虚函数、无用户自定义的构造函数、无私有或者受保护的非静态数据成员、无{}或=直接初始化非静态数据成员(c14支持)的类(class、struct、union)
//类中有私有或者受保护静态成员可以使用初始化列表,但是静态成员不能使用初始化列表
struct T2 {
int a;
int b;
protected:
static int c;
}t2{ 12,19 };
int T2::c = 10;
非聚合类:需要使用类构造函数来初始化私有变量
class ListInit
{
public:
ListInit(int num) :m_num(num) {
cout << "m_num = " << this->m_num << endl;
}
ListInit(int num,string str):m_num(num),m_str(str) {
cout << "m_num = " << this->m_num << " ,m_str = " << m_str << endl;
}
private:
int m_num;
string m_str;
};
聚合类型定义并非递归的,需要看实际情况判断
struct T3
{
int a = 3;
int b[3]{1,2,2};
int c;
T2 tt2;
};
//初始化列表
T3 t4{ 44,{11,22,33},99,{} };
5. = default
构造函数 = default,让编译器提供一个默认的构造函数,效率比用户自己写的高
只能修饰类中默认的构成函数:无参构造、析构、拷贝构造、运算符重载函数
一般放在类里面,也可以放在类外部
6. = delete
= delete的作用是显示禁用某个函数
类所有函数都可以使用= delete
7.initializer_list
initializer_list(轻量级类模板)一般作为参数传递
初始化时使用初始化列表{}初始化(只能把{}看做一个整体来初始化或者赋值)
其作用是定义一个可以接受任意相同类型个数的参数的函数
void test_initializer_list(initializer_list<int> ls) {
auto it = ls.begin();
for (;it != ls.end();++it) {
cout << *it << " ";
}
cout << endl;
}
//调用
test_initializer_list({1,2,3,4,56,67,7});