静态对象在类中的重要性以及它们与一般对象的区别

Importance of static object in a class and how they are different from general object

本文关键字:对象 区别 重要性 静态      更新时间:2023-10-16
#include "B.h"
class A
{
    public :
        A()
        {
            s_b = new B();
            b = new B();
        }
       static B *s_b;
        B *b;
};

#include<iostream>
using namespace std;
#include "A.h"
int main()
{
    cout<<"hello";
}

在我的项目中,我看到了如上所述的静态对象。但无法知道它的确切用途是什么以及它们与一般对象有何不同。请帮助我找出我可以用 b 没有做的s_b做什么。

首先,s_b不会为创建的A的每个实例占用内存,而b会占用内存。sizeof(A)增加b,但不增加s_b

static在类的所有实例之间共享,因此它的作用类似于全局实例。您不需要对象来访问它,您可以直接使用A::s_b

静态成员与在命名空间范围内定义的对象或函数之间唯一真正的区别是访问。 例如,静态数据成员可以是私有的,在这种情况下,不能在类外部访问它;静态函数成员可以访问私有数据成员,而命名空间范围的函数无法访问私有数据成员。

访问语法也不同:如果在类之外,则必须使用 ClassName::memberName(或 classInstance.memberName )来访问成员。 没有using可以使它以其他方式访问。

一般来说,

静态成员必须在类的声明之外初始化,如果不使用 C++11,则使用 Constant int 类型除外。

所以你上面发布的代码是有缺陷的。 你需要一个像这样的声明

    A::s_b = B();

在 A 类之外 { ... };在非静态构造函数中初始化静态成员是错误的,因为构造函数用于构造对象,但静态成员 不属于对象,但属于类。所以这些静态成员不能通过静态成员函数进行修改。

把"阶级"想象成"人",

把这个"阶级"的对象想象成一个特定的人,就像"约翰·史密斯"一样。所以如果你有一个领域,"薪水"。这应该是一个非静态字段,因为每个人都有不同的薪水。但是如果你有字段"total_population",它应该是一个静态成员,因为这个字段在语义上不属于一个特定的人,而是属于整个"人类"。