为什么在应该返回对象的方法中返回int是有效的?

时间:2016-06-06 17:30:58

标签: c++

如果该方法应该返回int类型的对象,为什么在方法B minus中返回B是有效的?

#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;
}

3 个答案:

答案 0 :(得分:53)

具有单个参数的构造函数被视为转换构造函数。当需要类型为X的参数,而是给出类型Y时,编译器将寻找从Y到X的转换构造函数(或类型转换运算符)。在这种情况下,它使用{{1}找到一个构造函数。从本质上讲,您的B(int)已更改为return (1-a);

正如其他几个(也是正确的)答案中所提到的,如果您不希望将构造函数视为转换构造函数,则应在其前面加上return B(1-a);关键字。

答案 1 :(得分:27)

该行

Lemma LongCompress (n : nat):
  n > 1 -> Rules ( RepString n 0  |= s 0 E ).
Proof.
  intro H. replace (s 0 E) with (RepString 1 0) by easy.
  apply LongCompress_general; auto.
Qed.

调用隐式转换构造函数

return (1-a);

所以它和写

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

请注意,仍然会生成复制构造函数,除非您return B(1-a);

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

delete

这实际上会强制用户写

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

答案 2 :(得分:13)

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

在您的情况下,您有一个接受int类型参数的构造函数,因此可以使用此构造函数将int转换为B

为了防止在转换中使用这些构造函数,您应该标记构造函数explicit - 这对于所有单参数构造函数来说都是一个好习惯,因为实际上这些隐式转换更常见不希望的。