[C++] 静态类成员

静态类成员

静态类成员分两种:静态成员函数和静态数据成员。静态成员是类的一部分,不是对象的一部分,独立于对象。
使用static关键字声明静态成员,在类的外部不再使用此关键字。

1. 静态数据成员(static data member)

静态数据成员独立于对象,只和类相关。虽然如此,仍然可以通过对象、引用或对象指针间接访问静态成员。
静态数据成语能够被声明为任意类型:如const,引用,或数组等等。

1.1 静态数据成员的初始化

const static 类型的变量可以在类内部初始化,其他的静态变量必须在类外部定义,同时初始化,只能定义一次。
即使 const static 可以在类内部初始化,仍然必须在类外部定义,定义时,不能再次初始化。

class Account {
 public:
     static double rate() { return interestRate; }
     static void rate(double);  // sets a new rate
 private:
     static const int period = 30; // interest posted every 30 days
     double daily_tbl[period]; // ok: period is constant expression
};
// 不带initializer定义静态变量,初始值在类定义内部指定。
const int Account::period;

类的声明一般放在头文件中:

//File: foo.h
class foo
{
private:
        static int i;
};

静态数据成员的初始化必须放在源文件中:

// File: foo.cpp
int foo::i = 0;

如果初始化放在头文件中,那么每一个包含此头文件的文件将拥有此静态变量的定义,由于用于初始化变量的代码被定义在多个源文件中,链接时将出现错误。

1.2 静态数据成员的类型可为类本身
class Bar {
public:
    // ...
private:
    static Bar mem1; // ok
    Bar *mem2;       // ok, 除指针,引用也ok
    Bar mem3;        // error
};
1.3 静态数据成员可用作默认参数
class Screen {
     public:
         // bkground refers to the static member
         // declared later in the class definition
         Screen& clear(char = bkground);
     private:
         static const char bkground = '#';
     };

2. 静态成员函数(static member function)

静态成员函数没有this参数,可以直接访问类的静态成员。

静态成员函数(静态方法)不能访问类的非静态变量。

这是因为,静态成员函数可以不经过实例调用,例如: Environment::display(), 假如这个函数里使用了非静态的变量,那变量的值会是多少呢?非静态变量和实例相关。

但是反过来可以,即类的一般成员函数可以访问类的静态成员。

如果类的静态成员定义放在类的外部,外部定义不再指定static关键字。

静态成员函数不应声明为const或者virtual

类的一般成员函数具有3大特点:
1. 能够访问类的内部成员
2. 在类的作用域之内 (in the scope of the class)
3. 必须通过实例调用
友元函数(friend function) 符合仅符合 1
静态成员函数同时符合 1 和 2
可以通过类名直接调用,且能操纵静态数据成员,这大概就是设计静态成员函数的目的。


[1] C++ Primer 12.6
[2]https://stackoverflow.com/questions/185844/how-to-initialize-private-static-members-in-c
[3]https://stackoverflow.com/questions/13203999/c-static-member-functions-and-variables
[4]https://stackoverflow.com/questions/1847038/illegal-call-to-non-static-member-function-c
[5]https://stackoverflow.com/questions/13203999/c-static-member-functions-and-variables
[6]https://stackoverflow.com/questions/2315166/where-would-you-use-a-friend-function-vs-a-static-member-function

猜你喜欢

转载自blog.csdn.net/ftell/article/details/80366203