[英]How does reassigning static variables work?
由于 static 变量的生命周期是程序的生命周期,当您尝试重新分配它时究竟会发生什么?
在下面的程序中, test.loc
在被销毁之前最终变成了 6,尽管构造函数是唯一可以更改该值的东西。 它是原始的 object 本身,那么它的成员变量之一如何变化?
#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;
}
Output:
Constructed!0
Constructed!6
Destroyed!6 // this is the locally constructed variable
Destroyed!6 // This is the static variable getting destroyed
您的程序没有定义赋值运算符 ( operator=
),因此编译器会为您创建一个。 该赋值运算符将从Test
的源实例中复制loc
的值,并更改目标实例中loc
的值。
如果您将以下内容添加到您的Test
class,您将看到发生了什么:
Test &operator=(const Test &src) {
std::cout << "Assigned!" << loc << "<-" << src.loc << "\n";
// this is what the default assigment operator does:
loc = src.loc
}
在下面的程序中,test.loc 在被销毁之前最终变成了 6,尽管构造函数是唯一可以更改该值的东西。
但这本质上就是您为更改loc
的值所做的事情。 如果我运行你的程序,我会得到这个 output:
Constructed!0
Constructed!6
Destroyed!6
Destroyed!6
调用了两个构造函数和两个析构函数。 第一个构造函数大概会在程序进入main
时被调用,其中test
是使用不带参数的构造函数构造的。 当您执行Test(6)
时,将调用第二个构造函数。 这将创建一个新的Test
object ,其loc
设置为 6,然后将临时分配给test
。 test
现在本质上是您创建的临时文件的副本。 至于这两个析构函数,一个是您创建的临时Test(6)
的,一个是test
的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.