- 静态const成员可以使用就地初始化
class A{
static const int static_const_member = 4; // 正确
static int static_member = 3; // 出现错误:error: ISO C++ forbids in-class initialization of non-const static member 'A::static_member' static int static_member = 3;
};
- 静态非const成员只能在类外初始化
class A{
static const int static_const_member = 4;
static int static_member; // 类内声明
};
int A::static_member = 3; // 类外定义并初始化
- static成员的声明和定义注意点:
- 对于静态非const成员必须在类外定义,在类内的只是声明式
- 对于静态const成员,可以只在类内声明而不定义,但是此时该成员必须是整数类型(char,bool,short),而且不能对该成员取地址,否则编译器报错,因为该成员未被定义。
- 对于静态const成员,如果在类内没有赋初值,则必须在类外定义并赋初值;如果在类内赋初值,需要在类外定义时不能够再赋值。
#include <iostream>
#define INT 1
using namespace std;
class A{
public:
static int a; // 声明式,必须在类外定义
// error: 'constexpr' needed for in-class initialization of static data member 'const double A::b' of non-integral type [-fpermissive]
// static const double b = 20.0; // 声明式,编译器报错,必须是整数类型,例如,int、 bool、 char
static const int c = 20.0; // 声明式,如果不在类外提供定义,则不能对它进行取地址运算。否则编译器报错
static const int d = 20.0; // 声明式,在类外提供定义
static const int e; // 声明式,在类外定义
};
int A::a = 9; // 类的静态非const成员必须在类外定义
const int A::d; // 类的静态const成员可以选择性地提供定义,非必须。如果不提供定义就不应该对它进行取地址运算。
// 下面对d的定义出错,因为已经在声明处赋予了初始值。
// error: duplicate initialization of 'A::d'
// const int A::d = 5;
const int A::e = 4;
// 下面对e的定义出错,因为e是const成员,而且在类中声明时并没有给定初值。
// error: uninitialized const 'A::e' [-fpermissive]
// const int A::e;
int main() {
int *pa = &A::a;
cout << "A::a = " << *pa << endl;
// 下面语句将报错“(.text+0x58): undefined reference to `A::c'”
// const int *pc = &A::c;
const int *pd = &A::d;
cout << "A::d = " << *pd << endl;
const int *pe = &A::e;
cout << "A::e = " << *pe << endl;
}