【发布时间】:2012-09-02 08:59:56
【问题描述】:
让我们有这个代码:
Test1 t1;
Test2 t2;
t1 = t2;
我相信有三种(或更多?)方法可以实现t1 = t2
- 在
Test1中重载赋值运算符 - 在
Test2中重载类型转换运算符 - 创建
Test1(const Test2&)转换构造函数
根据我的 GCC 测试,这是使用的优先级:
- 分配运算符
- 转换构造函数和类型转换运算符(不明确)
- const 转换构造函数和 const 类型转换运算符(不明确)
请帮助我理解为什么这个优先级。
我使用此代码进行测试(取消注释某些行以尝试)
struct Test2;
struct Test1 {
Test1() { }
Test1(const Test2& t) { puts("const constructor wins"); }
// Test1(Test2& t) { puts("constructor wins"); }
// Test1& operator=(Test2& t) { puts("assign wins"); }
};
struct Test2 {
Test2() { }
// operator Test1() const { puts("const cast wins"); return Test1(); }
// operator Test1() { puts("cast wins"); return Test1(); }
};
int main() {
Test1 t1;
Test2 t2;
t1 = t2;
return 0;
}
【问题讨论】:
-
Test1::Test1(const Test2&)不是“复制构造函数”,而是“转换构造函数”。 -
这篇文章解释了为什么转换运算符具有更高的优先级:stackoverflow.com/questions/1384007/…
标签: c++ casting copy-constructor assignment-operator