繁体   English   中英

重新分配 static 变量如何工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM