需要注意的是:类中的静态成员变量只有静态常量,并且类型是整型或者枚举类型,才能在类内初始化,其他都得在类外初始化。
#include <iostream> using namespace std; class Base { public: Base(){ } Base(int num){ } int a = { 4 }; int b{ 1 }; double cc = 1.23; char aa = 'a'; string str = "hello"; string str1{ "world" }; //string str2("hello,world"); //用()则会报错,类内不能用()初始化,在类外这个是有参构造,可以使用。 string str3 = { "hello" }; static int c; static const double d; static const char* const e; //静态常量字符数组指向静态字符数组 // 变量是静态常量,并且类型是整型或者枚举类型,才能在类内初始化,其他都得在类外初始化。 const static int f = 0; //const static 和 static const 意义相同,没有区别 }; int Base::c = 8; const double Base::d = 3.14; const char* const Base::e = "i am luffy"; int main() { int ab { 4 }; string str7 = { "hello" }; string str8("888"); string str9 { "888888" }; return 0; }另外还提供了初始化列表:
#include <iostream> using namespace std; class c { public: c() :m_num(66), a(3), b(3) { } c(int n1, int n2, int n3) : m_num(n1),a(n2), b(n3){ } int m_num = 8; int a; int b; }; int main() { c c1; c c2(11,22,33); cout << "c1.m_num = " << c1.m_num << " c1.a = " << c1.a << " c1.b = " << c1.b << endl; cout << "c2.m_num = " << c2.m_num << " c2.a = " << c2.a << " c2.b = " << c2.b << endl; system("pause"); return 0; }输出结果:
c1.m_num = 66 c1.a = 3 c1.b = 3 c2.m_num = 11 c2.a = 22 c2.b = 33使用初始化列表初始化成员变量
且从上面的程序中说明先运行了int m_num = 8;之后才进行初始化的m_num{66};
那么和之前的this->m_num = a;初始化方式比较谁先运行呢?
class c { public: c(int n1, int n2, int n3) : m_num(n1),a(n2), b(n3){ this->m_num = 99999; } int m_num = 8; int a; int b; }; int main() { c c2(11,22,33); cout << "c2.m_num = " << c2.m_num << " c2.a = " << c2.a << " c2.b = " << c2.b << endl; system("pause"); return 0; }