繁体   English   中英

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

[英]About conversion constructor and assignment operator

如何通过foo(int) (转换构造函数)和foo::operator=(int) (重载赋值运算符)来完成foo = 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绑定到foo::operator=(int) (完全匹配)

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

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

您仍然可以通过明确表达来实现第二个调用:

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

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

它们是有区别的:

foo a = 10;

调用foo::foo(int)

foo a;
a = 10;

a调用foo::operator=(int)

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

用例

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

foo f = 57;

赋值被称为foo::operator=(int)

foo f;
f = 57;

注意

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

对于这个声明

f = 57;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM