【问题标题】:Why it works when I assign the object with others' object?为什么当我将对象分配给其他人的对象时它会起作用?
【发布时间】:2014-09-19 03:07:24
【问题描述】:

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

【问题讨论】:

    标签: c++ object variable-assignment


    【解决方案1】:

    可以使用单个参数调用的每个构造函数都定义了一个隐式转换类类型。所以构造函数:

    A(B const& b)
    

    是一个转换构造函数。如果这种类型的转换没有用,您已经找到了答案:将其声明为explicit 可以防止它:

    explicit A(B const& b)
    

    【讨论】:

      【解决方案2】:

      我认为你的问题来自于认为它是分配。但是A a = B(); 是初始化。 a不是先用默认构造函数创建然后赋值给的,而是直接构造的。虽然我没有方便的标准参考,但如果您没有构造函数但有赋值运算符重载,则该行将无法编译,因为它不是assignemnt,它需要正确的构造函数。要分配,请尝试

      A a; 
      a = B(); // actually assigns A(B()) implicitly if no operator= overload
      

      如果一个类的所有数据成员都可以被赋值,那么这个类的对象就可以被赋值,这就是a = A();不用添加任何代码就可以工作的原因。

      如果要阻止隐式转换,请将构造函数设为explicit(其他答案中的示例)。

      【讨论】:

        猜你喜欢
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-16
        相关资源
        最近更新 更多