[英]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)
)。
这是基本的重载决议 。 两种重载都是可行的:
将57
绑定到foo::operator=(int)
(完全匹配)
通过转换构造函数将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.