【发布时间】:2021-08-07 09:22:41
【问题描述】:
由于静态变量的生命周期是程序的生命周期,当您尝试重新分配它时究竟会发生什么?
在下面的程序中,test.loc 在被销毁之前最终变成了 6,尽管构造函数是唯一可以更改该值的东西。它是原始对象本身,那么它的成员变量之一如何变化?
#include <iostream>
class Test
{
public:
int loc = 0;
Test()
{
std::cout << "Constructed!" << loc << "\n";
}
Test(int j)
{
loc = j;
std::cout << "Constructed!" << loc << "\n";
}
~Test()
{
std::cout << "Destroyed!" << loc << "\n";
}
};
static Test test;
int main()
{
// Write C++ code here
test = Test(6);
return 0;
}
输出:
Constructed!0
Constructed!6
Destroyed!6 // this is the locally constructed variable
Destroyed!6 // This is the static variable getting destroyed
【问题讨论】:
-
“尽管构造函数是唯一可以改变那个值的东西” 但是你再次调用构造函数来改变值...
test = Test(6)再次调用构造函数并且“重构”test,将loc的值设置为6。 -
@mediocrevegetable1 :但是 test 的内存地址不是新“构造”的 Test 对象,它仍然是旧的。因此,即使再次调用构造函数,该对象也是本地的,一旦退出 main 就被销毁,而静态变量在程序退出期间被销毁。
-
赋值也可以改变值,赋值就是
test = Test(6);是什么。 -
编译器会为您创建一个默认的复制赋值运算符,并写入值。
-
static在这里让人分心。如果您在main中定义Test test;,您会看到同样的情况。
标签: c++ constructor static-variables