我试图了解这段代码的行为:
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 = 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
通过上述构造函数创建一个临时文件。
...然后按通常的相反顺序构造解扰器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句