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)
被评论(或相反)。
答案 0 :(得分:8)
这是基本的重载决议。两种重载都是可行的:
将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])了解完整的血腥细节。
答案 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类型。它可以通过调用转换构造函数来实现。