静态对象在类中的重要性以及它们与一般对象的不同之处

时间:2012-12-13 14:22:12

标签: c++ object static

#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而不是b。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

访问语法也不同:如果在课外,您必须使用ClassName::memberName(或classInstance.memberName)来访问该成员。没有using可以使其无法访问。

答案 2 :(得分:1)

一般来说,如果不使用C ++ 11,则必须在类的声明之外初始化静态成员,但常量为int类型。

所以上面发布的代码存在缺陷。你需要一个像

这样的陈述
    A::s_b = B();

在A级以外{...};在非静态构造函数中初始化静态成员是错误的,因为构造函数用于构造对象而非静态成员  不属于该对象但属于该类。因此,无法通过静态成员函数修改这些静态成员。

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