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.初始化列表{}
对象\变量\指针 {} 对象\变量\指针 = {}
聚合类型可以使用初始化列表相当于给每个元素分别赋值;对于非聚合类型,则需要定义一个合适的构造函数,此时使用初始化列表会调用它对应的构造函数。
聚合类:
普通数组可以看做一个聚合体
无基类、无虚函数、无用户自定义的构造函数、无私有或者受保护的非静态数据成员、无{}或=直接初始化非静态数据成员(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,{} };
3.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});