在定义类的对象的时候,如果类中有定义构造函数,则调用用户自己定义的构造函数,没有则调用默认构造函数。
如果用户定义的构造函数是以参数列表的形式初始化成员变量,则成员变量的初始化顺序是按照成员变量的声明的顺序。
具体看下面的例子和输出结果:
例1:
#include<iostream>
using namespace std;
int i=1;
class A
{
private:
int i1;
int i2;
int i3;
int& i4;//i4是引用,它的值随着引用对象改变而改变
public:
A():i4(i3),i2(i++),i1(i++),i3(i++)
{
i3 = i;
}
void Fun()
{
cout<<i1<<" "<<i2<<" "<<i3<<" "<<i4<<endl;
}
};
int main()
{
A a;
a.Fun();
return 0;
}
输出结果:
1 2 4 4
例2:
class A
{
private:
int n1;
int n2;
public:
A():n2(0),n1(n2+2){}
void Print(){
cout << "n1:" << n1 << ", n2: " << n2 <<endl;
}
};
int main()
{
A a;
a.Print();
return 1;
}
输出结果
如果我把A类中构造函数改成:
A()
{
n2 = 0;
n1 = n2 +2;
}
输出结果
PS:在类的继承中,尤其是多重继承的时候,构造函数的初始化列表的初始化顺序是根据继承的先后开始先后执行父类的构造函数,最后才是子类自己的成员变量初始化。