C++中的类静态成员及静态成员函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangell/article/details/38226001

静态成员

    静态类成员有一个特点: 无论创建了多少对象, 程序都值创建一个静态类变量副本. 也就是说, 类的所有对象共享同一个静态成员.

    注意: 静态数据成员在类声明中声明(即test.h), 在包含类方法的文件中初始化(即test.cpp). 初始化时使用作用域操作符来之处静态成员所属的类.
              如果静态成员是整型const 或枚举类型const, 则可以在类声明中初始化.
              如果在头文件中进行初始化, 将出现多个初始化语句副本, 从而引发错误.
              静态数据成员的初始化不应该被放在头文件中而应该放在含有类的非inline函数定义的文件中.
              静态数据成员可以被声明为任意类型它们可以是const 对象数组或类对象等等.

  静态成员的初始化及使用:

        如类

// test.hxx中定义
class Test
{
private:
    char *str;
    int len;
    static int num_strings;
public:
    Test(const char *s);
    Test();
    Test(const Test& t); // 默认私有化拷贝构造函数是个好习惯
    Test& operator=(const Test& t); // 默认私有化复制操作符是个好习惯
    static int HowMany() {return num_strings;} // 此函数只为演示静态类成员函数, 请参考以下说明
}
// test.cpp中对静态类成员复制实现
#include <cstring>
#include <iostream>
#include "test.h"

using std::cout;

// initializing static class member
// 初始化类静态成员变量
// 注意: 不能在类声明中初始化静态成员变量, 这是因为声明描述了如何分配内存, 但并不分配内存.
//       对于静态类成员, 可以在类声明之外使用单独的语句来进行初始化, 这是因为静态类成员是单独存储的, 而不是对象的组成部分.
//       初始化语句指出了类型, 并使用了作用域操作符.
int Test::num_strings = 0;

// class mode
// ... 以后省略

静态成员函数

    特别说明: 由于静态成员函数不与特定的对象相关联, 因此只能使用静态数据成员.
                      如上例子, 静态方法HowMany()可以访问静态成员num_strings, 但不能访问 str 和 len.

    private:

        1. 不能通过对象调用静态成员函数;
        2. 静态成员函数甚至不能使用this指针;

    public:

        1. 可以使用类名和作用域解析操作符来调用; (参见以上代码实现的HowMany函数)
        2. 调用方式: int cout = Test::Howmany();


具体详细可参考: http://blog.csdn.net/damontive/article/details/17514873

猜你喜欢

转载自blog.csdn.net/wangell/article/details/38226001