当我将对象与其他对象分配时,为什么它可以工作?

时间:2014-09-19 03:07:24

标签: c++ object variable-assignment

我想将类型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();
}

2 个答案:

答案 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(另一个答案中的示例)。