强制转换符号重载的问题
来源:互联网 发布:iea数据 编辑:程序博客网 时间:2024/06/05 18:33
看了转换操作符的文章,如作者所述,果然有如下问题。
class convertClassC{ int data;public: convertClassC() { data = 0; } /* convertClassC(convertClassC &object) { data = object.data; // printf("the copy constructor\n"); } */ void dataSet(double f) { data = f; } ~convertClassC() { }};class convertClassD{ convertClassC objectC;public: convertClassD():objectC() { objectC.dataSet(1); } operator convertClassC() { // printf("cast to convertClassA\n"); return this->objectC; } ~convertClassD() { }};int convertClass(){ convertClassC c; convertClassD d;c = (convertClassC)d;return 1;}
这个可以运行。
但是如果增加convertClassC的拷贝构造函数,即复原convertClassC类中的注释部分,那么就无法运行,除非改变强制转换的方式,即改成引用转换。
operator convertClassC&() { // printf("cast to convertClassA\n"); return this->objectC; }
不得其解。
看其汇编代码发现强制转换分为两个步骤,在有拷贝构造函数的情况下。
009364E8 lea ecx,[ebp-20h] 009364EB call convertClassD::operator convertClassC & (93119Fh) 009364F0 push eax 009364F1 lea ecx,[ebp-0F8h] 009364F7 call convertClassC::convertClassC (9314B5h) 009364FC mov dword ptr [ebp-100h],eax 00936502 mov eax,dword ptr [ebp-100h] 00936508 mov ecx,dword ptr [eax] 0093650A mov dword ptr [ebp-14h],ecx
其中
009364EB call convertClassD::operator
这个调用其实什么也没做,只是将B的对象的地址保存在ecx寄存器中。
然后拷贝构造一个新对象后,用新对象来完成赋值操作。
如果没有自定义拷贝构造,那么汇编代码如下
c = (convertClassC)d;00A464D8 lea eax,[ebp-0F8h] 00A464DE push eax 00A464DF lea ecx,[ebp-20h] 00A464E2 call convertClassD::operator convertClassC (0A4123Fh) 00A464E7 mov byte ptr [ebp-4],2 00A464EB mov ecx,dword ptr [ebp-0F8h] 00A464F1 mov dword ptr [ebp-104h],ecx 00A464F7 lea edx,[ebp-104h] 00A464FD mov dword ptr [ebp-10Ch],edx 00A46503 mov eax,dword ptr [ebp-10Ch] 00A46509 mov ecx,dword ptr [eax] 00A4650B mov dword ptr [ebp-14h],ecx
00A464E2 call convertClassD::operator
其实也是仅仅只做了一个储存d的地址的事情。
另外一点是,没有再另外创建一个对象。
综上所述,在有拷贝构造的函数的情况下,那么会先根据d的数据创建一个convertClassC的对象,然后用这个对象给赋值。
没有构造函数的情况下,那么赋值的时候就直接将convertClassB对象看做C对象,然后赋值。
按照上面看,引用运算符应当是拷贝构造新对象的时候所必须的。为什么必须呢,至今没有想到很合理的解释。
- 强制转换符号重载的问题
- 关于有符号数到无符号数的强制转换导致的一些问题
- 有符号数与无符号数的强制类型转换问题
- 无符号与有符号数之间的强制转换
- C++强制转换重载
- 强制类型转换的问题
- 类型强制转换的问题
- c++类的隐式转换和强制转换重载
- 关于c++提取符号“>>”的重载问题
- 实参类型的强制转换(重载函数的匹配)
- 【C++】强制类型转换运算符的重载
- 带符号8位整型向带符号16位整型的强制转换
- 无符号数与有符号数之间的强制转换
- 强制转换出现的变态问题!
- 模板特化和强制转换的问题
- foreach 参数强制类型转换的问题
- 一个强制类型转换的问题
- 关于强制类型转换的小问题
- TOKEN_PRIVILEGES
- 第五周上级任务(补充)
- 9、进程通信之命名管道
- 分支程序设计
- ftp配置
- 强制转换符号重载的问题
- LayoutInflater的inflate函数用法详解
- Qt Creator 为我们的程序写一个动态链接库help.dll
- Ajax使用的四大步骤
- 经典面试题】寻找单链表倒数第n个节点_C/C++
- C++ 第七周任务-用星图体验循环结构程序设计
- Wireshark抓包工具使用教程以及常用抓包规则 ——Powered By 死性不改
- String对象常用API
- 线性表的链式存储结构之单链表类的实现_Java