class Fred { public: void print() { cout << data << endl; } void setData(double d) { data = d; } static int count; private: double data; }; __________count = 0;
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样
class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字
为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
能在类中初始化的成员只有一种,那就是静态常量成员。
这样不行
class A { private: static int count = 0; // 静态成员不能在类内初始化 };
这样也不行
class A { private: const int count = 0; // 常量成员也不能在类内初始化 };
但是这样可以
class A { private: static const int count = 0; // 静态常量成员可以在类内初始化 };
结论:
总结如下表:
类型 初始化方式 | 类内(声明) | 类外(类实现文件) | 构造函数中 | 构造函数的初始化列表 |
非静态非常量数据成员 | N | N | Y | Y |
非静态常量数据成员 | N | N | N | Y (must) |
静态非常量数据成员 | N | Y (must) | N | N |
静态常量数据成员 | Y | Y | N | N |
以下三种类型必须通过初始化列表来初始化
1.非静态 常量
2. 引用类型
3. 没有默认构造函数的类类型
class MyClass { public: MyClass(); ~MyClass(); private: /*类内部*/ int a1 = 0; //非静态非常量数据成员:可在类内声明赋初值 const int a2 = 0; //非静态常量数据成员 :可在类内赋初值 static const int a3 = 0; //静态常量数据成员 :可在类内赋初值 static int a4 = 0; //静态非常量数据成员 :不可在类内赋初值 private: }; /*类外部*/ int MyClass::a1 = 1; //错误提示:非静态成员不能在其类外部定义 const int MyClass::a2 = 2; //错误提示:非静态成员不能在其类外部定义 const int MyClass::a3 = 3; //正确 int MyClass::a4 = 4; //正确 MyClass::MyClass():a1(1),a2(2) /*初始化列表*/ { /*构造函数中赋值*/ a1 = 10; a2 = 10; //错误提示:表达式必须是可修改的左值(a2是常量当然不可修改) } MyClass::~MyClass() { }
这个题目考察的是C++类的静态成员,类的静态成员是属于整个类的,而不是属于某一个对象的,并且静态成员需要内类定义,类外初始化,初始化的时候可以不要static关键字,所以选B
这个题目可以做一个引申
什么东西可以在内类进行初始化呢?
答案是静态常量成员,类的静态成员是在内类定义,类外初始化的,类的常量成员必须要在初始化列表中初始化,但是类的静态常量成员是唯一可以在类内进行初始化的成员
例如: