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