C++——静态成员详解

Posted Albert Nie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++——静态成员详解相关的知识,希望对你有一定的参考价值。

有时候,类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联,而这就是静态成员。

本质:静态成员与类本身直接相关,而不与类对象保持关联,除此之外,它和其他类成员基本一样

静态成员包括:静态成员数据,静态成员函数

如何声明?

在成员声明之前加上static关键字。

class A {
public:   // or private 
    static int a;        // 静态成员数据声明,也是定义
    static int func();   // 静态成员函数声明
    static int func() const; // error!
}

note : 静态成员函数也不与任何对象绑定在一起,即不拥有this指针,这也就导致了静态成员函数体内不能使用this指针,也不能访问非静态成员(隐式this指针),且其不能被声明为const(因为const表示该函数不会修改对象的成员数据,而static函数压根不能访问对象(非类)的数据成员,也就谈不上修改了,故而c++规定不能用将静态成员函数声明为const。)

再次强调:静态成员函数只能访问类的静态成员变量。

如何定义?

注意,这时成员数据和成员函数的行为是不同的。

  • 成员数据

    • 通常在外部初始化
    int A::a = 10;
    
    • 如果非要在内部初始化,那么成员数据必须是 constexpr 或者 const 修饰的整数类型,初始值必须是字面值常量整数类型
    class A{
         // ok,但只能用于类内替换,否则必须在外部重新定义(具体见C++ primer 5nd p271),但不需要再次指定初始值
        static constexpr int a = 10; 
        static const float a = 10.0;   // error 不是整数类型
        static int a = 10;   // error!
    } 
    
  • 成员函数:内类内外都可定义,不写static关键字。

int A::func(){    // 内外定义,加上类作用域,不写static关键字
   ....
}

如何使用?

  • 通过作用域运算符访问
cout << A::a << endl;
  • 和普通成员函数一样
A obj;  
A* ptr;
cout << obj.a << endl;    // 通过对象(或引用)访问
cout << ptr->a << endl;  // 通过指针访问

特殊场合

  • 静态数据类型可以是不完全类型,特别的,静态数据成员的类型可以就是它所属的类类型,普通成员则不行。
class A{
    static A a;  // ok
    A b;  // error!
}
  • 静态成员可以做默认实参,普通成员则不行。
class A{
   static int a;
   int func(int num =  a;)
}

参考资料: c++ primer 5nd p268–p272。

以上是关于C++——静态成员详解的主要内容,如果未能解决你的问题,请参考以下文章

C++入门静态成员详解(定义实现原理使用注意事项)

C++之继承详解

C++ 继承 详解

C++继承详解

C++继承详解

[C/C++]详解C++中的继承