C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c:转换运算符与赋值运算符与转换构造函数优先级大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有这个代码
Test1 t1;
Test2 t2;
t1 = t2;

我相信有三种(或更多?)方法如何实现t1 = t2

>在Test1中重载赋值运算符
>在Test2中重载类型转换操作符
>创建Test1(const Test2&)转换构造@L_675_2@

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

>分配操作符
>转换构造@L_675_2@和类型转换操作符(不明确)
> const转换构造@L_675_2@和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;
}

解决方法

陈述t1 = t2;相当于:
t1.operator=(t2);

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

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

>通过Test1 :: Test1(Test2 const&)转换构造@L_675_2@将t2转换为Test1.>通过Test2 ::运算符Test1()const cast运算符将t2转换为Test1.

大佬总结

以上是大佬教程为你收集整理的c:转换运算符与赋值运算符与转换构造函数优先级全部内容,希望文章能够帮你解决c:转换运算符与赋值运算符与转换构造函数优先级所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。