自定义类型转换函数operator MyInt()

/***

* 结论:对pass-by-value传参的常规调用,会用实参拷贝构造形参,实参与形参相互无影响;

* 当对实参调用类型转换函数(返回形参类型),编译器会优化代码使类型转换函数返回值直接构造在调用作用域的接受对象上

*/

cpp 复制代码
/***
 * 结论:对pass-by-value传参的常规调用,会用实参拷贝构造形参,实参与形参相互无影响;
 * 当对实参调用类型转换函数(返回形参类型),编译器会优化代码使类型转换函数返回值直接构造在调用作用域的接受对象上
*/
#include "stdio.h"
class YourInt;
void handle_yourInt(YourInt);   // 友元函数必须全局声明
class MyInt;
class YourInt
{
    private:
    int val;
    public:
    YourInt(int _val):val(_val){}
    YourInt(const YourInt& rhs):val(rhs.val)
    {
        printf("call YourInt(const YourInt& rhs)\n");
    }
    //YourInt(const MyInt& rhs);
    friend void handle_yourInt(YourInt yourInt)
    {
        printf("address of input yourInt: %lu\n",(unsigned long)&yourInt);
        return;
    }
};
class MyInt
{
    public:
    int val;
    public:
    MyInt(int _val):val(_val){}
    operator YourInt() const
    {   // MyInt到 YourInt的类型转换, 返回值类型就是operator YourInt()的YourInt
        printf("call operator YourInt(MyInt{%d})\n",val);
        YourInt rtn = YourInt(val);     // 调用YourInt(int)构造
        printf("address of type-cast's rtn: %lu\n",(unsigned long)&rtn); // 140701897039976,140701897039976
        //return &rtn;// error: no viable conversion from returned value of type 'YourInt *' to function return type 'YourInt'
        return rtn;
    }
    operator char()const
    {   // MyInt到char的类型转换,返回值类型就是operator char()的char
        return (char)val;
    }
};
//YourInt::YourInt(const MyInt& rhs):val(rhs.val)
//{
//    printf("call YourInt(const MyInt& rhs)\n");
//}
int main(int argc,char* argv[])
{
    auto func1 = []()->void{
        MyInt myInt(3);
        YourInt yourInt(myInt); // 当定义有YourInt(const MyInt&)拷贝构造函数时优先调用之,否则调用operator YourInt()类型转换
        printf("address of yourInt: %lu\n",(unsigned long)&yourInt);
        // 140701897039976,对myInt调用operator YourInt()类型转换,编译器优化后直接在调用作用域(此处yourInt)构造rtn|yourInt?
    };
    auto func2 = []()->void{
        MyInt myInt(4);
        handle_yourInt(myInt); //  error: conversion from 'MyInt' to 'YourInt' is ambiguous,当同时定义有YourInt(MyInt)拷贝构造函数与operator YourInt()类型转换时会引发歧义
        // 140701897039976,对myInt调用operator YourInt()类型转换,编译器优化后直接在调用作用域(handle_yourInt函数内)构造rtn|形参yourInt?
    };
    auto func3 = []()->void{
        YourInt yourInt(5);
        printf("address of yourInt: %lu\n",(unsigned long)&yourInt);    // 140701897039984
        handle_yourInt(yourInt);    // 实参拷贝构造形参,形参地址140701897039976
    };
    func1();
    printf("...\n");
    func2();
    printf("...\n");
    func3();
}
/***
call operator YourInt(MyInt{3})
address of type-cast's rtn: 140701897039976
address of yourInt: 140701897039976
...
call operator YourInt(MyInt{4})
address of type-cast's rtn: 140701897039976
address of input yourInt: 140701897039976
...
address of yourInt: 140701897039984
call YourInt(const YourInt& rhs)
address of input yourInt: 140701897039976
*/
相关推荐
昊虹AI笔记5 分钟前
PHP中类名加双冒号的作用
android·java·php
码农易小航9 分钟前
Dockerfile打包部署
java·运维·docker
拾荒的小海螺13 分钟前
JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南
java·开发语言·spring boot
Evand J26 分钟前
MATLAB下的RSSI定位程序,二维平面上的定位,基站数量可自适应
开发语言·matlab·平面
lshzdq26 分钟前
【设计模式】1. 构建器模式(Builder Pattern)是一种创建型设计模式
java·设计模式·建造者模式
北京理工大学软件工程32 分钟前
C++-qt经验
开发语言·c++
Am心若依旧40943 分钟前
[高阶数据结构四] 初始图论
开发语言·数据结构·c++·图论
我是水怪的哥1 小时前
python安装包中的一些问题(一):conda list 已经安装的包为啥在spyder pip list中没有?
开发语言·windows·python
禾乃儿_xiuer1 小时前
《用Python实现3D动态旋转爱心模型》
开发语言·python·3d·pygame·表白·爱心代码·初学者
李豆豆喵1 小时前
第29天:安全开发-JS应用&DOM树&加密编码库&断点调试&逆向分析&元素属性操作
开发语言·javascript·安全