关于转换构造函数和赋值运算符

时间:2014-01-26 16:02:35

标签: c++ constructor operator-overloading operator-keyword assignment-operator

foo = int(转换构造函数)和foo(int)(重载赋值运算符)可以完成像foo::operator=(int)这样的操作吗?当一个人被召唤而不是其他人(也许一个是基本的)?

#include <iostream>

class foo
{    
  public:

    foo(){}

    foo(int r_value)
    {
      std::cout << "\nfoo::foo(int)\n";
    }

    void operator=(int r_value)
    {
      std::cout << "\nfoo::operator=(int)\n";
    }

};

int main()
{
  foo f;
  f = 57;
  return 0;
}

上面的代码会使operator=(int)在两者都存在时运行,foo(int)如果operator=(int)被评论(或相反)。

4 个答案:

答案 0 :(得分:8)

这是基本的重载决议。两种重载都是可行的:

  1. 57绑定到foo::operator=(int)(完全匹配)

  2. 通过转换构造函数隐式转换57foo,并将临时foo对象绑定到隐式定义的foo::operator=(foo const &)

  3. 由于后者需要比前者更多的转换,因此它是一个不太好的匹配,并选择前一个重载。

    您仍然可以通过显式

    来实现第二个调用
    f = foo(57);  // binds perfectly to foo::operator=(foo const &)
    

    重载决策的全套规则相当长且涉及,但在这样的个别情况下,答案是直截了当的。不过,请参阅13.3([over.match])了解完整的血腥细节。

答案 1 :(得分:3)

有区别:

foo a = 10;

致电foo::foo(int)

foo a;
a = 10;

foo::operator=(int)

中拨打a

答案 2 :(得分:1)

两种实现都不同。第一个是构造函数,第二个是赋值。用例会有所不同,并且会根据用例相应地调用每个用例。

使用案例

构造函数名为foo::foo(int)

foo f = 57;

分配称为foo::operator=(int)

foo f;
f = 57;

注意

在上面的用例和示例中使用赋值有更多的开销,因为它调用默认构造函数和赋值。

答案 3 :(得分:0)

对于本声明

f = 57;

编译器首先考虑所有函数operator =。有两个这样的函数:由您明确定义的函数和由编译器隐式定义的复制赋值运算符。第一个是最合适的功能。所以它被称为。

如果您将对此赋值运算符进行注释,则编译器只有一个函数operator =。它是隐式定义的复制赋值运算符。但它无法直接应用。因此编译器寻求一种方法将提供的参数转换为foo类型。它可以通过调用转换构造函数来实现。