Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++中的对象生存期。当我运行代码时: class Foo { public: Foo(); Foo(const Foo &old); ~Foo(); int x_; }; int nextX = 0; Foo::Foo() { cout << "Foo(): " << (x_ = nextX++) << endl; } Foo::Foo(const Foo &old) { cout << "Foo(const Foo &old): " << (x_ = nextX++) << endl; } Foo::~Foo() { cout << "~Foo(): "<< x_ << endl; } int main() { Foo foo; cout << "-----------------" << endl; vector<Foo> v(1); cout << "-----------------" << endl; Foo bar; cout << "-----------------" << endl; v[0]=bar; cout << "-----------------" << endl; return 0; }_C++_Object Lifetime - Fatal编程技术网

C++;对象生存期和调用的析构函数 我试图理解C++中的对象生存期。当我运行代码时: class Foo { public: Foo(); Foo(const Foo &old); ~Foo(); int x_; }; int nextX = 0; Foo::Foo() { cout << "Foo(): " << (x_ = nextX++) << endl; } Foo::Foo(const Foo &old) { cout << "Foo(const Foo &old): " << (x_ = nextX++) << endl; } Foo::~Foo() { cout << "~Foo(): "<< x_ << endl; } int main() { Foo foo; cout << "-----------------" << endl; vector<Foo> v(1); cout << "-----------------" << endl; Foo bar; cout << "-----------------" << endl; v[0]=bar; cout << "-----------------" << endl; return 0; }

C++;对象生存期和调用的析构函数 我试图理解C++中的对象生存期。当我运行代码时: class Foo { public: Foo(); Foo(const Foo &old); ~Foo(); int x_; }; int nextX = 0; Foo::Foo() { cout << "Foo(): " << (x_ = nextX++) << endl; } Foo::Foo(const Foo &old) { cout << "Foo(const Foo &old): " << (x_ = nextX++) << endl; } Foo::~Foo() { cout << "~Foo(): "<< x_ << endl; } int main() { Foo foo; cout << "-----------------" << endl; vector<Foo> v(1); cout << "-----------------" << endl; Foo bar; cout << "-----------------" << endl; v[0]=bar; cout << "-----------------" << endl; return 0; },c++,object-lifetime,C++,Object Lifetime,因此,我的问题是: 为什么在语句v[0]=bar中不调用复制构造函数 为什么最初称为bar的对象的析构函数会被调用两次(即在输出中看到两次~Foo():2) 有人能帮我吗 多谢各位 调用赋值运算符是因为v[0]处的对象已构造。自动赋值运算符将执行所有成员的浅层复制,这些成员 由于自动赋值运算符的浅拷贝,~Foo():2似乎会出现两次,因为两个对象包含值为2的成员x 调用赋值运算符是因为v[0]处的对象已构造。自动赋值运算符将执行所有成员的浅层复制,这些成员 由于自动赋值运算符的浅拷贝,~Foo(

因此,我的问题是:

  • 为什么在语句
    v[0]=bar
    中不调用复制构造函数
  • 为什么最初称为bar的对象的析构函数会被调用两次(即在输出中看到两次
    ~Foo():2
  • 有人能帮我吗

    多谢各位

  • 调用赋值运算符是因为v[0]处的对象已构造。自动赋值运算符将执行所有成员的浅层复制,这些成员

  • 由于自动赋值运算符的浅拷贝,~Foo():2似乎会出现两次,因为两个对象包含值为2的成员x

  • 调用赋值运算符是因为v[0]处的对象已构造。自动赋值运算符将执行所有成员的浅层复制,这些成员

  • 由于自动赋值运算符的浅拷贝,~Foo():2似乎会出现两次,因为两个对象包含值为2的成员x


  • v[0]=巴时调用隐式定义的复制赋值运算符(
    Foo&operator=(const Foo&);
    )。它将
    x
    (2)从
    bar
    复制到
    v[0]
    。因此,当调用
    bar
    v[0]
    的析构函数时,您会看到
    2
    调用隐式定义的复制赋值运算符(
    Foo&operator=(const Foo&);
    )。它将
    x
    (2)从
    bar
    复制到
    v[0]
    。因此,当调用
    bar
    v[0]
    的析构函数时,您会看到
    2

    Try正在使用赋值运算符,因此2出现两次Try正在使用赋值运算符,因此2出现两次

    v[0]=bar
    不是复制构造,而是赋值(您没有重载). 首先,我要说的是,您需要将“nextX”设置为一个静态变量,这样它就不会对每个新对象重置为0。看看会发生什么。波尔卡舞者nextX不在类中,因此不会重置,它已经是全局静态的。
    v[0]=bar
    不是复制构造,而是赋值(您没有重载)。首先,我要说的是,您需要将“nextX”设置为一个静态变量,这样它就不会对每个新对象重置为0。看看会发生什么。波尔卡舞者nextX不在类中,因此不会重置,它已经是全局静态的。
    Foo(): 0
    -----------------
    Foo(): 1
    -----------------
    Foo(): 2
    -----------------
    -----------------
    ~Foo(): 2
    ~Foo(): 2
    ~Foo(): 0