gpt4 book ai didi

c++ - 尝试将对象分配给 C++ 中不同类型的对象

转载 作者:行者123 更新时间:2023-12-03 11:15:02 25 4
gpt4 key购买 nike

我试图理解这段代码的行为:

class A {
public:
int a;
A(int x = 0): a(x) {cout << "A-ctor" << endl;}
~A() {cout << "A-dtor" << endl;}
};

class B {
public:
int b;
B(int x = 0): b(x) {cout << "B-ctor" << endl;}
~B() {cout << "B-dtor" << endl;}
};

int main() {
A a;
B b;
a = b.b;
return 0;
}

这个程序的输出是:

A-ctor
B-ctor
A-ctor
A-dtor
B-dtor
A-dtor

我的问题是,在 main(): a = b.b 的这一行中,A 类的一个实例被创建并立即销毁。为什么会这样?此外,当我试图将一个类的对象分配给不同的类时,我不应该得到编译错误吗?

最佳答案

这个作业

a = b.b;

有效,因为通过此构造函数有一个用户定义的(隐式)从 intA 的转换:

A(int x = 0): a(x) {cout << "A-ctor" << endl;}

这样的构造函数被称为 converting constructors (可以使用单个参数调用,并且未声明为 explicit)。如果要防止隐式转换,请将其声明为 exlicit.

输出来自

A a;            // A-ctor
B b; // B-ctor
a = b.b; // A-ctor

注意最后一行实际上调用了编译器生成的A::operator=(const A&),因为你没有声明一个A::operator=(int)。一个临时的 A 是通过上面的构造函数创建的。

...然后像往常一样以相反的构造顺序使用析构函数。

关于c++ - 尝试将对象分配给 C++ 中不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66261711/

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