C++之static静态修饰符详解

静态类成员:是那些与类本身有关的成员数据和成员函数,而不是与该类对象相关的成员数据和成员函数。

所以静态成员数据也称为类数据,静态成员函数也称为类方法。静态成员数据在类里只是一个说明,还需要一个定义(或叫初始化)。静态成员数据要在类定义之外被初始化(要用类名限定修饰)而且程序里只能提供一次,所以初始化不能放在头文件里。

例1:

class Test{
public:
	static int k;
	Test(int a):k(a){  //编译错误!!!

	}
};

 //error: 'int Test::k' is a static data member; it can only be initialized at its definition

例2:

C++规定const静态类成员可以直接初始化,其他非const的静态类成员需要在类声明以外初始化,我们一般选择在类的实现文件中初始化。

int Test::k;
默认初始化为0;

也可自己指定:

int Test::k(20);


class Test{
public:
	static const int a = 10; 
	static int k;
};

int Test::k;

int main(){
	cout << Test::k << endl;
	cout << Test::a;
	return 0;
}


inline 函数里不要使用静态成员数据,因为编译器不能保证此时静态成员数据已初始化。
class Test{
public:
	static const int a = 10;
	static int k;
	void f(){
		k++;
	}
};
int Test::k(20);
int main(){
	Test t;
	t.f();
	cout << Test::k;
	return 0;
}

class A{
public:
	A(A & e):_e3(e){}
	A & _e3;
	A * _e1;
	static A _e;
 	A _e2;  // error C2460: '_e2' : uses 'A', which is being defined 
  };


静态成员数据与全局变量的比较:静态成员数据不论类由多少实例,它都只有一个拷贝,这和全局变量类似。但静态成员数据有个作用域名字,而且不一定是 public 的。

静态成员函数不能声明为 const volatile

静态成员函数和友元函数比较:静态成员函数和友元函数都没有隐含的 this 指针,且都能访问类的 private protected 部分。但静态成员函数有个作用域名字,而且不一定是 public 的。

const 静态成员数据:在有些 C++ 编译器里,有序型的(如 int,unsigned long,char 等) const 静态成员数据可以

在类里对其初始化。


静态成员数据初始化次序:静态初始化成员数据次序和类作用域的静态对象、文件作用域和名字空间作用域的对象的生存周期有关。当在不同编译单元(即 . cpp 文件)的静态初始化有次序依赖,这就有可能有危险。解决的办法将静态成员数据转换为静态成员函数。


volatile: 当一个对象的值可能会在编译器的控制或监视之外被改变,那该对象应该声明为 volatile 。 此时编译器执行的一些例行优化对它不能应用。 volatile 也可以修饰类成员函数。对于 volatile 类对象它只能调用 volatile 成员函数、构造函数和析构函数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值