类的静态数据成员(C++)

  • 静态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成员的声明和定义注意点:
  1. 对于静态非const成员必须在类外定义,在类内的只是声明式
  2. 对于静态const成员,可以只在类内声明而不定义,但是此时该成员必须是整数类型(char,bool,short),而且不能对该成员取地址,否则编译器报错,因为该成员未被定义。
  3. 对于静态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;

}

猜你喜欢

转载自blog.csdn.net/weixin_40315481/article/details/107905386
今日推荐