gpt4 book ai didi

c++ - 用于赋值的参数化构造函数

转载 作者:太空狗 更新时间:2023-10-29 19:51:15 25 4
gpt4 key购买 nike

我注意到参数化构造函数中有一些我无法理解的行为。给定以下程序:

#include <iostream>
using namespace std;

class A {
public:
int x;

A() {}

A(int i) : x(i){
cout << "A\n";
}
~A(){
cout << "dA\n";
}

};

int main(){
A p;
p = 3;
cout << p.x << endl;
p = 5;
cout << p.x << endl;
return 0;
}

我得到的输出是:

A
dA
3
A
dA
5
dA

这意味着使用 = 会触发参数化构造函数,销毁调用它的对象并创建一个新对象。我无法理解这种行为,也无法在标准中找到答案(我确定它在某处,但可能会以复杂的方式说明)。谁能帮我解释一下?

最佳答案

您可能正在寻找的短语是“隐式转换”。

如果你添加一个复制构造函数和一个赋值运算符,然后给每个对象一个唯一的 ID,就更容易看出事情的进展:

int counter = 0;

class A {
public:
int id;

A(): id(++counter) {cout << "A(): " << id << "\n";}

A(int i) : id(++counter) {cout << "A(" << i << "): " << id << "\n";}

// Don't copy the id.
// (This isn't used anywhere, but you can't see that it's not used unless it exists.)
A(const A& a) : id(++counter) {cout << "A(" << a.id << "): " << id << "\n";}

// Don't copy the id here either.
A& operator=(const A&a) {cout << id << " = " << a.id << "\n"; return *this;}

~A(){cout << "destroy: " << id << "\n";}
};

int main(){
A p;
cout << "p is " << p.id << "\n";
p = 3;
cout << "p is " << p.id << "\n";
p = 5;
cout << p.id << "\n";
}

输出:

A(): 1
p is 1
A(3): 2
1 = 2
destroy: 2
p is 1
A(5): 3
1 = 3
destroy: 3
1
destroy: 1

如您所见,参数化构造函数用于创建一个临时对象,该对象的值可以分配给p,并且该临时对象会在之后立即销毁。
您还可以看到 p 一直活到最后。

关于c++ - 用于赋值的参数化构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50738907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com