13

让我们有这个代码:

Test1 t1;
Test2 t2;
t1 = t2;

我相信有三种(或更多?)方法来实施t1 = t2

  • 重载赋值运算符Test1
  • 重载类型转换运算符Test2
  • 创建Test1(const Test2&)转换构造函数

根据我的 GCC 测试,这是使用的优先级:

  1. 赋值运算符
  2. 转换构造函数和类型转换运算符(不明确)
  3. 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;
}
4

2 回答 2

15

该语句t1 = t2;等效于:

t1.operator=(t2);

现在适用重载决议的通常规则。如果有直接匹配,那就是选择的。如果不是,则考虑将隐式转换与(自动生成的,“隐式定义的”)复制赋值运算符一起使用。

有两种可能的隐式用户定义转换。所有用户定义的转换计数相等,如果两者都定义,则重载是不明确的:

  • 通过转换构造函数转换t2为 a 。Test1Test1::Test1(Test2 const &)

  • 通过强制转换运算符转换t2为 a 。Test1Test2::operator Test1() const

于 2012-09-09T00:59:01.987 回答
0

当我使用以下代码时,优先级优先于构造函数而不是强制转换运算符

 #include<iostream>
 using namespace std;
 class C1;
 class C2
 {
      int x;
 public:
     operator C2()
     {
       C2 temp;
       cout<<"operator function called"<<endl;
       return temp;
    }
 };
class C1
{
   int x;
public:
   C1():x(10){}
   C1(C2)
  {
    cout<<"constructor called"<<endl;
  }
};
 int main()
{
  C1 obj1;
  C2 obj2;
  obj1=obj2;
}

输出构造函数调用

于 2018-04-13T18:36:45.747 回答