C++之静态成员

来源:互联网 发布:商务部数据 编辑:程序博客网 时间:2024/05/18 09:13

C++静态成员包含静态数据成员和静态成员函数两部分。

1. 静态数据成员

C++中类的静态数据成员声明如下:

template<typename T>class Test{     ......     static T _staticVal;     ...... };

和其它数据成员一样,静态数据成员也遵守public、protected、private访问规则。静态数据成员实际上是类作用域中的全部变量,其定义(或初始化)不应该被放在头文件中,定义方式类似于全局变量,如下:

template<typename T> T Test<T>::_staticVal=value;//假设value是T类型,并且赋值合法

C++标准规定,如果静态数据成员同时被const修饰,那么这个成员既可以在类内部初始化也可以在类外部初始化,如下:

template <typename T>class Test{    static const T _staticVal;};template<typename T> const T Test<T>::_staticVal=value;

template <typename T>class Test{    static const T _staticVal =value ;//假设赋值合法};

另外需要注意的是不要在类声明的头文件中定义静态数据成员,这样做容易引起重复定义的错误,即使加上#ifndef、#define、#endif、或者#pragma once也难避免。

静态数据成员被类及其派生类的所有对象共享,即派生类对象与基类对象共享基类的静态数据成员。


静态数据成员可以当做成员函数的默认参数,而普通数据成员则不行。如下:

template<typename T>class Test{    public:             void fun1(T param=_staticVal1) {}//OK             void fun2(T param=_Val2) {}//error              static T _staticVal1;              T _Val2;};


关于静态数据成员的类型有下面的一个特征:

静态数据成员的类型可以是类类型,但是非静态数据成员的类型不能是类类型,只可以是类类型的引用或指针。

2.静态成员函数

首先,类的静态成员函数不含有this指针,因此静态成员函数不可以调用类的非静态成员,包括类的非静态数据成员和普通的成员函数。
静态成员函数不可以同时声明为virtual、const、volatile函数,如下:

template<typename T>class Test{       virtual static void fun1() {}//error       static void fun2() const {} //error       static void fun3() volatile {} //error};
之前一直不知道的一个特点:静态成员函数的地址可以用普通函数指针来存储,而普通成员函数地址需要用类成员函数指针来存储。

template<typename T>class Test{public:    void nostatic() {}    static void staticfun() {}};void (*f1)()=&Test<int>::staticfun;void (Test<int>::*f2)()=&Test<int>::nostatic;int A::value=1;

3.关于const成员函数

const 成员函数用来保证函数不会改变对象的状态,在const成员函数中const修饰的是this指针,因此static数据成员在const成员函数中是可变的,另一方面,如果需要在const成员函数中修改某些与对象的状态无关的数据成员,那么这些数据成员就应该声明为mutable,在C++中mutable是为了突破const的限制而设置的。


0 0