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

文章讨论了在C++中,pass-by-value参数传递时,如果实参被类型转换函数调用,编译器如何进行优化以提高性能。重点讲解了MyInt类的operatorYourInt()转换函数如何影响YourInt对象的创建和内存地址。
摘要由CSDN通过智能技术生成

/***
 * 结论:对pass-by-value传参的常规调用,会用实参拷贝构造形参,实参与形参相互无影响;
 * 当对实参调用类型转换函数(返回形参类型),编译器会优化代码使类型转换函数返回值直接构造在调用作用域的接受对象上
*/

/***
 * 结论:对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
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值