C++类的静态成员

静态成员的声明和定义

#静态成员的声明和定义:
在类的定义中用static关键字声明静态成员
#注意:
静态成员并不与类实例相绑定即:当定义完静态成员之后,我们并不需要实例化这个类就可以访问静态成员。
#插入:
##声明和定义:
声明(Declare/Declaration):声明是编译器需要的。声明时引入标识符并描述其类型,无论是类型,对象还是函数。编译器需要该“声明”,以便识别在它处使用该标识符。
定义(define/definition):定义是链接器需要的。定义实现这个标识符,链接器需要该定义,以便将标识符链接到所表示的实体。
##区别:
1.定义可以代替声明而反之不行
2.可以多次声明但只能定义一次
3.定义通常伴随着编译器为标识符分配内存
#静态成员的特性
1.静态成员有着静态存储区:程序开始时分配内存,程序结束时收回内存
2.静态成员支持零初始化,即:当定义的时候没有进行初始化则自动将静态成员初始化为0
3.静态成员存储在内存的全局/静态区,而类实例存储在内存的栈区,这样无论实例化多少个类对象,静态成员始终只有全局/静态区的一块内存。所有类对象共同访问一个静态成员
#静态成员的使用规则
(1) 声明为“constexpr”类型的静态数据成员必须 在类中声明 并初始化。自C++17 起,可以不在类外定义
(2) 声明为“inline”(C++17 起) 或者 “const int” 类型的静态数据成员可以 在类中声明 并初始化;
(3) 其它须在类外 定义并初始化,且不带static 关键字
(4) 类的静态函数和非静态函数都可以访问静态成员
区别:静态函数可以用类名的方式调用,非静态函数必须用实例对象调用。
#初学者的建议
1.静态成员类内声明,
2.类外定义并初始化,并且不带static关键字(只有在类内才用static)

#实例

#include <iostream>
#include <typeinfo>
#include <array>
using namespace std;
class Circle{
private:
    double radius;
    static int num;
public:
    Circle() = default;
    Circle(double radius){
        this->radius = radius;
        num++;
    }
    int getNum(){
        return num;
    }
};
int Circle::num = 0;
int main()
int main()
{
    Circle c1{1.0};
    cout<<c1.getNum()<<endl;

}

版权声明:本文为mxy568767179原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。