在进行类成员变量初始化的时候,C++11标准对于C++98做了补充,允许在定义类的时候在类的内部直接对非静态变量进行初始化,在初始化的时候可以使用等号=,也可以使用花括号{},等号可以省略不写;静态成员变量需要在类的外部初始化。
#include <iostream>
using namespace std;
class Base
{
private:
//非静态成员变量
int a = 9;
int b = { 5 };
int c{ 12 };
double array[4] = { 3.14, 3.15, 3.16, 3.17 };
double array_1[4]{ 3.14, 3.15, 3.16, 3.17 };
string s1{ "hello world" };
//静态成员变量
static int d;
static const double e;
static const char* const f; //类的静态成员,但不是整形或者枚举
//变量是静态常量,并且类型是整形或者枚举类型可以在类内初始化
const static int g = 0;
};
int Base::d = 100;
const double Base::e = 3.14;
const char* const Base::f = "lll eee";
在类内部赋值和初始化列表
我们对静态成员变量除了可以在构造函数内部进行赋值,也可以在类的初始化列表中进行初始化(这种方式比在构造函数内部赋值效率高)。那么如果同事在类的内部对非静态成员变量就地初始化和在初始化列表中进行初始化会怎样呢?
#include<iostream>
class Init
{
public:
//初始化列表
Init(int x, int y, int z) :a(x), b(y), c(z) {}
//函数内部初始化
int a = 1;
int b = 2;
int c = 3;
};
int main()
{
Init tmp(10, 20, 30);
std::cout << "a: " << tmp.a << ", b: " << tmp.b << ", c: " << tmp.c << std::endl;
return 0;
}
这里看出来两者并没有冲突,程序可以正常运行,程序先在类内部对变量初始化,又在初始化列表中进行初始化。