2014-09-19 90 views
0

我想将类型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

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

A(B const& b) 

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

explicit A(B const& b) 
0

我认为你的问题是以为它是分配。但是A a = B();是初始化。 a不是先用默认的构造函数创建然后赋值的,而是直接构造的。虽然我没有标准引用,但如果你没有构造函数,但赋值运算符有重载,那行就不会编译,因为它不是确定的,它需要正确的构造函数。有分配,尽量

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

如果一个类的所有数据成员可以分配,那么类的对象可以分配,所以这就是为什么a = A();作品无需添加任何代码。

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

相关问题