静态对象初始值设定项C++
static object initializer C++
可能的重复项:
文件范围和静态浮点数
什么是静态变量?
这是一本书中的代码。
class X
{
int i;
public:
X(int ii = 0) : i(ii) {cout<<i<<endl;} // Default
~X() { cout << "X::~X()" << endl; }
};
void f()
{
static X x1(47);
static X x2; // Default constructor required
}
int main()
{
f();
return 0;
}
我的问题是为什么我要像函数 f() 一样将对象声明为静态对象?如果我没有将 x1 和 x2 声明为静态,会发生什么情况?
对于此代码,它对程序的可观察行为没有影响。
将main
更改为调用f
两次而不是一次,并观察差异 - 如果变量static
则只创建一对X
对象(第一次调用f
),而如果它们不static
则每次调用创建一对对象。
或者,更改main
以在调用 f
后打印内容。然后观察到,使用 static
,X
对象在main
打印后被销毁(静态对象一直存在到程序结束),而如果没有static
,对象在main
打印之前被销毁(自动对象只活到退出其范围,在这种情况下函数f
)。
第一次命中函数 f() 时,将初始化静态(延迟加载)。如果它们没有被声明为静态,那么它们将是局部变量,并在每次调用函数 f() 时重新创建。
所有对 f() 的调用都将导致使用相同的 x1 和 x2。
两者之间的区别
int f()
{
int i = 0;
++i;
return i;
}
int f2()
{
static int i = 0;
++i;
return i;
}
int main()
{
for (int i = 0; i < 10; ++i) { cout << f1() << ' ' << f2() << endl; }
}
是 f1 将始终创建一个新的局部变量 i 并将其设置为零然后递增它,而 f2 将创建一个static
局部变量 i 并将其初始化为零一次,然后每次调用它都会从上一个调用值递增它。
下面是一些代码来测试函数中的静态对象是什么意思:
#include <iostream>
using namespace std;
class A {
public:
void increase() {
static int b = 0;
b++;
cout << "A::increase: " << b << endl;
}
};
int main() {
A a;
a.increase();
a.increase();
a.increase();
return 0;
}
输出为:
A::increase: 1
A::increase: 2
A::increase: 3
注意到 b 的值在函数调用之间保持不变了吗?这是关于 ideone 的示例,以便您可以使用它。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象