2016-06-06 30 views
24

如果方法应该返回B类型的对象,为什么它返回int的方法B minus它为什么会在返回一个对象的方法中返回一个int?

#include <iostream> 

class B 
{ 
public: 
    int a; 
public: 
    B(int i=0) 
    { 
     a=i; 
    } 
    B minus() 
    { 
     return (1-a); 
    } 
}; 

int main() 
{ 
    B x(18); 
    x = x.minus(); 
    std::cout << x.a << '\n'; 
    return 0; 
} 
+16

你没有标注你的构造'explicit'。 – user2357112

+3

看看你的'B'构造函数。 “B”如何构建? – PaulMcKenzie

+0

我假设由于构造函数采用int,所以它也是从int中隐式构造的。 –

回答

53

具有单个参数的构造函数被认为是一个转换构造函数。当需要X类型的参数,并且给定类型Y时,编译器将查找从Y到X的转换构造函数(或类型转换运算符)。在这种情况下,它会使用B(int)构造函数找到一个。实质上,您的return (1-a);更改为return B(1-a);

正如在其他几个(也是正确的)答案中提到的,如果您不希望构造函数被视为转换构造函数,则应该使用关键字explicit作为前缀。

13

这是因为单参数构造函数可以用作从参数类型到对象类型的隐式转换。

在你的情况,你有一个构造函数接受一个类型为int的参数,所以这个构造函数可以用来将int转换为B

为了防止这些构造函数在转换中使用,您应该标记构造函数explicit - 对于所有单参数构造函数,这是一个很好的做法,因为在实践中,这些隐式转换通常比期望的更不理想。

27

线

return (1-a); 

调用隐式转换构造

B(int i=0) 
{ 
    a=i; 
} 

因此,它是一样的书写

return B(1-a); 

注意,拷贝构造函数仍然产生,除非你delete它。


如果你想避免这种情况,写

explicit B(int i=0) 
// ^^^^^^^^ 
    { 
     a=i; 
    } 

这实际上将强制用户写

return B(1-a); 
相关问题