文章目录
- 构造函数的初始化列表
- 需要显式初始化列表的场景
- 初始化顺序
构造函数的初始化列表
- 构造函数对数据成员进行初始化还可以通过成员初始化列表的方式完成。语法格式:
构造函数名(参数表):成员1(初始值参数),成员2(初始值参数){}
#include<iostream>usingnamespacestd;classStudent{private:string m_name;intm_age;intm_no;public:Student(conststring&name,intage,intno):m_name(name),m_age(age),m_no(no){cout<<"Student constructor"<<endl;}voidsetName(conststring&name){m_name=name;}voidsetAge(intage){if(age<0)cout<<"无效年龄"<<endl;elsem_age=age;}voidsetNo(intno){m_no=no;}voidsleep(inthour){cout<<"我睡了"<<hour<<"小时"<<endl;}voideat(conststring&food){cout<<"我正在吃"<<food<<endl;}voidlearn(conststring&course){cout<<"我正在学习"<<course<<endl;}voidwho(){cout<<"我叫: "<<m_name<<", 我今年"<<m_age<<endl;}};intmain(void){Students1("张飞",21,10003);s1.who();s1.eat("烧烤");Students2("刘备",28,10000);s2.who();s2.learn("C++");return0;}
需要显式初始化列表的场景
- 一般而言,使用初始化列表和在构造函数体对成员变量进行赋初值,两者区别不大,可以任选一种,但是下面几种场景必须要使用初始化列表:
- 如果有类类型的成员变量(成员子对象),而该类又没有无参构造函数,则必须要通过初始化列表显式指明其初始化方式
- “const”修饰的成员变量(常成员变量)必须要在初始化列表中初始化
- “引用型”成员变量必须要在初始化列表中初始化
#include<iostream>usingnamespacestd;classA{private:intm_data;public:A(intdata){cout<<"A(int)"<<endl;m_data=data;}};classB{private:A m_a;public:B(void):m_a(123){cout<<"B(void)"<<endl;}};intmain(void){B b;//一定会去构造成员对象m_a , 未指定如何构造,系统去调用m_a的无参构造函数return0;}
#include<iostream>usingnamespacestd;intnum=12;classA{public:int&m_r;constintm_c;/* * error A(void){ m_r = num; m_c = 100; } */A(void):m_r(num),m_c(100){}};intmain(void){A a;cout<<a.m_r<<" "<<a.m_c<<endl;return0;}
初始化顺序
- 类中成员变量按声明顺序依次被初始化,而与初始化表中的顺序无关
#include<iostream>usingnamespacestd;classA{public:A(inta){cout<<"A constuctor"<<endl;}};classB{public:B(intb){cout<<"B constuctor"<<endl;}};classC{private:A m_a;B m_b;public:C(inta,intb):m_b(b),m_a(a){}};intmain(void){Cc(1,2);return0;}