类成员的初始化有两种形式1,初始化列表进行成员的初始化。2,利用构造函数进行初始化。前者取决于成员在类中的声明顺序,后者取决于函数内变量的顺序。
下面对于两种情况进行代码演示:
1.构造函数进行成员初始化
class Date
{
public:
Date(int y,int m,int d);
......
private:
int year;
int month;
int day;
};
Date::Date(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
2.成员初始化列表:
class Date
{
public:
Date(int y,int m,int d);
......
private:
int year;
int month;
int day;
};
Date::Date(int y,int m,int d):year(y),month(m),day(y)
{}
对于这两种初始化方式我们要进行选择:
在C++中某些类型的成员是不允许在构造函数中使用赋值语句进行赋值的。例如:const修饰的数据成员或者是引用类型的数据成员是不允许用赋值语句直接进行赋值的。举例如下:
class A
{
public:
A(int x1):x(x1),rx(x),pi(3.14)
{}
void print()
{
cout<<"x="<<x<<" "<<"rx="<<rx<<" "<<"pi="<<pi<<endl;
}
private:
int x;
int
const double pi;
};
int main()
{
A a(10);
a.print();
return 0;
}
下面举个例子让大家更深入的理解成员列表初始化
#include<iostream>
using namespace std;
class D
{
public:
D(int i):mem2(i),mem1(mem2+1)
{
cout<<mem1;
cout<<mem2;
}
private:
int mem1;
int mem2;
};
int main()
{
D d(15);
return 0;
}
输出结果为:
mem1:-858994454
mem2:15
分析:按照构造函数中的成员初始化列表的顺序,数据成员是按照声明的顺序依次初始化的,数据成员mem1先初始,接着mem2,因此在mem2尚未初始化前,mem1用mem2+1初始化时随机的。mem2初始化为15.