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

标签 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) 在两者都存在时运行,如果 operator=(int) 被注释,则 foo(int) (或相反)。

最佳答案

这是基本的过载解决方案。两种重载都是可行的:

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

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

由于后者比前者需要更多的转换,匹配度较差,因此选择了前者重载。

你仍然可以通过显式来实现第二个调用:

f = foo(57);  // binds perfectly to foo::operator=(foo const &)

整套重载决议规则相当长且复杂,但在像这样的个别情况下,答案是直截了当的。不过,请参阅 13.3 ([over.match]) 了解完整的详细信息。

关于c++ - 关于转换构造函数和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21365738/

相关文章:

c++ - 如何暂停关闭按钮功能一段时间?

c++ - VirtualAlloc 在某些硬盘配置上失败

c++ vector如何更改内部指针

c++ - 构造函数错误 : expected ‘{’ at end of input

c++ - 为类中的自定义类型重载 operator=

c++ - g++ 链接器 :/usr/lib/libGL. so.1:无法读取符号:无效操作

C++ 构造函数错误

java - 在这种情况下可以从构造函数中抛出异常吗?

同一运算符的 C++ 多个运算符重载

c++ - 重载 << 运算符错误 C2804 : binary 'operator <<' has too many parameters