对于非静态成员,C++11允许在声明成员变量的同时使用'='或'{ }'进行就地初始化。
#include <string>
#include <iostream>
using namespace std;
class Data{
private:
int m_d1 = 1;
char m_d2 = 'c';
double m_d3{3.14};
string m_d4{"hello"};
public:
void pData()
{
cout<<"m_d1="<<m_d1<<endl;
cout<<"m_d2="<<m_d2<<endl;
cout<<"m_d3="<<m_d3<<endl;
cout<<"m_d4="<<m_d4<<endl;
}
};
int main()
{
Data data;
data.pData();
return 0;
}
运行程序输出:
m_d1=1
m_d2=c
m_d3=3.14
m_d4=hello
对于静态成员,则只允许常量整型或常量枚举类型的成员进行就地初始化。
class Data{
private:
static const int m_d1 = 1; //可以通过编译
static int m_d2 = 1; //静态非常量成员,无法通过编译
static string m_d3 = "hello"; //静态非常量成员,无法通过编译
};
如果一个成员变量在被就地初始化的同时又出现在构造函数初始化列表或构造函数的函数体中:
1.首先起作用的是就地初始化的值。
2.如果初始化列表中有对成员做初始化,那么用初始化列表中的值覆盖就地初始化的值
3.如果构造函数的函数体中有对成员进行赋值,那么不管之前是做了就地初始化还是初始化列表,最终的值都是构造函数体中对成员赋值后的值。
#include <string>
#include <iostream>
using namespace std;
class Data{
private:
int m_d1 = 1;
char m_d2 = 'c';
double m_d3{3.14};
string m_d4{"hello"};
public:
Data(){}
Data(int d1, string d4):m_d1(d1), m_d4(d4)//初始化列表的值会覆盖就地初始化的值
{
m_d4 = "goodbye";//赋值操作会最终完成对成员的值的设定
}
void pData()
{
cout<<"m_d1="<<m_d1<<endl;
cout<<"m_d2="<<m_d2<<endl;
cout<<"m_d3="<<m_d3<<endl;
cout<<"m_d4="<<m_d4<<endl;
}
};
int main()
{
Data data(2, "hi");
data.pData();
return 0;
}
//执行程序输出:
m_d1=2
m_d2=c
m_d3=3.14
m_d4=goodbye