尝试将对象分配给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;
工作的,因为有从定义(隐含的)转换一个用户int来A从这个构造:
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通过上述构造函数创建一个临时对象。
...然后像往常一样以相反的构造顺序进行析构函数。