如果数据成员是常量或者引用的情况:
1.常量和引用不可以在构造函数中进行赋值:
#include<iostream>
using namespace std;
class A
{
public:
A(int i = 0)
{
m_i = 10;
m_j = 30; //error 这一句代码叫做赋初值
m_k = m_i; //error
}
private:
int m_i;//变量
const int m_j;//常量
int& m_k;//引用
};
2.常量也不可以在类的数据成员定义时去赋值:
#include<iostream>
using namespace std;
class A
{
public:
A(int i = 0)
{
m_i = 10;
}
const int &GetJ()
{
return m_j;
}
private:
int m_i;//变量
const int m_j=30;//常量
};
int main()
{
A aa;
cout << aa.GetJ() << endl;
return 0;
}
这样是错误的,但是在高版本的编译器可以运行成功输出m_j
的值,但是低版本的编译器不能运行。
3.常量必须在成员初始化列表(冒号语法)进行初始化(赋值)
#include<iostream>
using namespace std;
class A
{
public:
A(int i = 0):m_j(50)//这一句代码叫做初始化,成员初始化列表
{
m_i = 10;
}
const int &GetJ()
{
return m_j;
}
private:
int m_i;//变量
const int m_j;//常量
};
int main()
{
A aa;
cout << aa.GetJ() << endl;
return 0;
}
运行结果:
4.引用必须在成员初始化列表(冒号语法)进行初始化(赋值)
#include<iostream>
using namespace std;
class A
{
public:
A(int i = 0):m_j(50),m_k(m_i)
{
m_i = 10;
}
const int &GetJ()
{
return m_j;
}
const int &GetK()
{
return m_k;
}
private:
int m_i;//变量
const int m_j;//常量
int& m_k;//引用
};
int main()
{
A aa;
cout << aa.GetJ() << endl;
cout << aa.GetK() << endl;
return 0;
}
运行结果:
总结:
成员初始化列表是为了解决类成员的初始化困惑。
数据成员是常量或者引用的时候必须要初始化,在普通函数中要在声明的时候初始化,在类中要在成员初始化列表进行初始化。