静态对象在类中的重要性以及它们与一般对象的区别
Importance of static object in a class and how they are different from general object
#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",它应该是一个静态成员,因为这个字段在语义上不属于一个特定的人,而是属于整个"人类"。
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 构造对象 c++ (cocos2d-x) 时的区别
- C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
- 类型测试对象的动态数组的这两个声明之间的区别?
- 这些情况有什么区别?我怎么知道什么是临时对象?
- 迭代器和标量对象之间的未定义行为有什么区别吗?
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- C++ 中的对象创建类型有什么区别?
- 通过引用传递对象和基元之间的区别
- 让一个名为A的类.传递以下两个对象有什么区别:(a)obj1和(b)obj1()
- 构造对象时 c++ 中的括号和大括号有什么区别
- 在 c++ 中将结构的每个成员写入文件和将结构对象直接写入文件之间有什么区别吗?
- C++ std::vector 创建对象然后添加对象与在向量中创建对象之间的区别?
- 返回本地静态的函数和返回静态成员的函数之间有什么区别(对象大小、性能等)?
- (类 *对象;)和(object = new class();)之间有什么区别
- 通过值和参考,对象构建返回对象之间的区别
- 构建对象的方法之间有什么区别
- 声明静态对象和指向静态对象的指针之间的区别
- 对象和实例之间的区别:C++
- 我创建的c++istream对象和cin之间的区别在哪里,它在库中的可见位置在哪里