C++ 重新分配静态变量是如何工作的?
既然静态变量的生命周期就是程序的生命周期,那么当您尝试重新分配它时,会发生什么呢 在下面的程序中,C++ 重新分配静态变量是如何工作的?,c++,constructor,static-variables,C++,Constructor,Static Variables,既然静态变量的生命周期就是程序的生命周期,那么当您尝试重新分配它时,会发生什么呢 在下面的程序中,test.loc在被破坏之前变成6,尽管构造函数是唯一可以改变该值的东西。它是原始对象本身,那么它的一个成员变量是如何变化的呢 #include <iostream> class Test { public: int loc = 0; Test() { std::cout << "Constructed!" <<
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;
}
在下面的程序中,test.loc在被破坏之前变成了6,尽管构造函数是唯一可以改变该值的东西
但实际上,这就是更改loc
的值所要做的。如果我运行您的程序,我会得到以下输出:
构造!0
构建!6.
摧毁!6.
摧毁!6.
调用两个构造函数和两个析构函数。当程序进入main
时,可能会调用第一个构造函数,其中test
是用不带参数的构造函数构造的。当您执行Test(6)
时,将调用第二个构造函数。这将创建一个新的Test
对象,其loc
设置为6,然后将临时对象分配给Test
<代码>测试现在本质上是您创建的临时文件的副本。至于两个析构函数,一个是您创建的临时Test(6)
,另一个是Test
在下面的程序中,test.loc在被破坏之前变成了6,尽管构造函数是唯一可以改变该值的东西
但实际上,这就是更改loc
的值所要做的。如果我运行您的程序,我会得到以下输出:
构造!0
构建!6.
摧毁!6.
摧毁!6.
调用两个构造函数和两个析构函数。当程序进入
main
时,可能会调用第一个构造函数,其中test
是用不带参数的构造函数构造的。当您执行Test(6)
时,将调用第二个构造函数。这将创建一个新的Test
对象,其loc
设置为6,然后将临时对象分配给Test
<代码>测试现在本质上是您创建的临时文件的副本。至于两个析构函数,一个是您创建的临时Test(6)
,另一个是Test
,您的程序没有定义赋值运算符(运算符=
),因此编译器会为您创建一个。该赋值运算符将从Test
的源实例复制loc
的值,并将更改目标实例中loc
的值
如果将以下内容添加到测试
类中,您将看到发生了什么:
Test &operator=(const Test &src) {
std::cout << "Assigned!" << loc << "<-" << src.loc << "\n";
// this is what the default assigment operator does:
loc = src.loc
}
Test&operator=(const-Test&src){
std::cout您的程序没有定义赋值运算符(运算符=
),因此编译器会为您创建一个赋值运算符。该赋值运算符将从Test
的源实例复制loc
的值,并将更改目标实例中loc
的值
如果将以下内容添加到测试
类中,您将看到发生了什么:
Test &operator=(const Test &src) {
std::cout << "Assigned!" << loc << "<-" << src.loc << "\n";
// this is what the default assigment operator does:
loc = src.loc
}
Test&operator=(const-Test&src){
std::cout“即使构造函数是唯一可以更改该值的东西”,但您再次调用构造函数来更改该值…test=test(6)
再次调用构造函数并“重建”test
,将loc
的值设置为6。@mediocrevegetable1:但test的内存地址不是最新的地址“constructed”测试对象,而不是它仍然是旧的。因此,即使再次调用构造函数,该对象仍然是本地的,并且在退出main时被销毁,而静态变量在程序退出时被销毁。赋值也可以更改值,赋值就是Test=Test(6)
是。编译器为您创建一个默认的复制赋值运算符,并写入值。静态
是一个分散注意力的地方。如果您在Test;
内部定义了main
,您会看到同样的情况,尽管构造函数是唯一可以更改该值的东西“但是您再次调用构造函数来更改值…test=test(6)
再次调用构造函数并“重建”test
,将loc
的值设置为6。@mediocrevegetable1:但test的内存地址不是新的“构造的”测试对象,而不是它仍然是旧的。因此,即使再次调用构造函数,该对象是局部的,并且在退出main时被销毁,而静态变量在程序退出时被销毁。赋值也可以更改值,赋值就是Test=Test(6)
是。编译器为您创建一个默认的复制赋值运算符,并写入值。static
是一个分散注意力的地方。如果您定义了Test;
内部main
“编译器为您创建一个默认的复制赋值运算符,并写入值”这有助于我理解它是如何决定复制什么的。“编译器为您创建了一个默认的复制赋值运算符,并写入值”这有助于我理解它是如何决定复制什么的。