我想将类型B的对象分配给A类对象,但我不知道为什么它可以用于不同类型的分配?
#include <stdio.h>
class B
{
public:
B()
{
printf("B default constructor.\n");
}
};
class A
{
public:
A()
{
printf("A Default constructor.\n");
}
A(B const& b) // if add the tag "explicit" for the constructor, it will not work...
{
printf("User constructor.\n");
}
A(const A& a)
{
printf("copy-constructor.\n");
}
void get(){printf("A::get\n");}
};
int main()
{
A a = B(); // What's the meaning to assign object of type B to object of type A?
为什么它适用于以上行? 这样做时如何运作?
a.get();
}
答案 0 :(得分:0)
每个可以使用单个参数调用的构造函数都定义了隐式转换到类类型。所以构造函数:
A(B const& b)
是转换构造函数。如果此类转换无效,您已找到答案:将其声明为explicit
可以阻止它:
explicit A(B const& b)
答案 1 :(得分:0)
我认为你的问题来自于认为它是任务。但A a = B();
是初始化。 a
不首先使用默认构造函数创建,然后分配给它,它是直接构造的。虽然我没有标准参考,但如果你没有构造函数但是赋值运算符重载,那么该行将不会编译,因为它不是assignemnt,它需要正确的构造函数。要进行分配,请尝试
A a;
a = B(); // actually assigns A(B()) implicitly if no operator= overload
如果可以分配类的所有数据成员,则可以分配类的对象,这样a = A();
可以在不添加任何代码的情况下工作。
如果要阻止隐式转换,请创建构造函数explicit
(另一个答案中的示例)。