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

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

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;}

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

输出来自

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

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

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


以上是尝试将对象分配给C++中不同类型的对象的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>