C ++:转换运算符与赋值运算符与转换构造优先(c++: cast operator vs. ass

2019-07-31 11:04发布

我们有这样的代码:

Test1 t1;
Test2 t2;
t1 = t2;

我认为有三个(或更多?)的方式如何实现t1 = t2

  • 重载的赋值运算符Test1
  • 重载型铸造操作者Test2
  • 创建Test1(const Test2&)转换构造

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

  1. 赋值运算符
  2. 转换器构造器和类型转换运算符(含糊)
  3. 常量转换构造和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;
}

Answer 1:

声明t1 = t2; 相当于:

t1.operator=(t2);

现在重载的一般规则。 如果有一个直接匹配,这是不二人选。 如果没有,那么隐式转换被认为是与(自动生成的,“隐式定义”)拷贝赋值运算符的使用。

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

  • 转换t2Test1通过Test1::Test1(Test2 const &)转换构造。

  • 转换t2Test1通过Test2::operator Test1() const类型转换操作符。



Answer 2:

当我用下面的代码不是优先考虑先构造函数,而不是转换运算符

 #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;
}

输出构造方法中调用



文章来源: c++: cast operator vs. assign operator vs. conversion constructor priority