Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新分配静态变量是如何工作的?_C++_Constructor_Static Variables - Fatal编程技术网

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
“编译器为您创建一个默认的复制赋值运算符,并写入值”这有助于我理解它是如何决定复制什么的。“编译器为您创建了一个默认的复制赋值运算符,并写入值”这有助于我理解它是如何决定复制什么的。