【问题标题】:How does reassigning static variables work?重新分配静态变量如何工作?
【发布时间】: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


【解决方案1】:

您的程序没有定义赋值运算符 (operator=),因此编译器会为您创建一个。该赋值运算符将从Test 的源实例复制loc 的值,并将更改目标实例中loc 的值。

如果您将以下内容添加到您的 Test 类中,您将看到发生了什么:

Test &operator=(const Test &src) {
    std::cout << "Assigned!" << loc << "<-" << src.loc << "\n";
    // this is what the default assigment operator does:
    loc = src.loc
}

【讨论】:

    【解决方案2】:

    在下面的程序中,test.loc 在被销毁之前最终变成了 6,尽管构造函数是唯一可以更改该值的东西。

    但这本质上就是您要更改loc 的值。如果我运行你的程序,我会得到这个输出:

    Constructed!0
    Constructed!6
    Destroyed!6
    Destroyed!6
    

    调用了两个构造函数和两个析构函数。第一个构造函数大概会在程序进入main 时被调用,其中test 是用不带参数的构造函数构造的。当您执行Test(6) 时,将调用第二个构造函数。这将创建一个新的Test 对象,其loc 设置为6,然后将临时分配给testtest 现在本质上是您创建的临时文件的副本。至于这两个析构函数,一个是你创建的临时Test(6),一个是test

    【讨论】:

    • “编译器会为你创建一个默认的复制赋值运算符,并写入值”这帮助我理解了它如何决定要复制的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多