• More Effective C++ 条款21 利用重载技术避免隐式类型转换


    1. 正如条款19条款20所言,临时对象的构造和析构会增加程序的运行成本,因此有必要采取措施尽量避免临时对象的产生.条款20介绍了一种用于消除函数返回对象而产生临时对象的方法——RVO,但它并不能解决隐式类型转换所产生的临时对象成本问题.在某些情况下,可以考虑利用重载技术避免隐式类型转换.

    2. 考虑以下类UPInt类用于处理高精度整数:

    class UPInt{
    public:
        UPInt();
        UPInt(int value);
        ...
    };
    const UPInt operator+(const UPInt& lhs,const UPInt& rhs);
    View Code

        那么以下语句可以通过编译:

    UPInt upi1;
    ...
    UPInt  upi2=2+upi1;
    upi3=upi1+2;
    View Code

        原因在于UPInt的单int参数构造函数提供了一种int类型隐式转换为UPInt类型的方法:先调用UPInt的单int参数构造函数创建一临时UPInt对象,再调用operator+.此过程产生了一临时对象,用于调用operator+并将两个UPInt对象相加,但实际上要使int与UPInt相加,不需要隐式类型转换,换句话说,隐式类型转换只是手段,而不是目的.要避免隐式类型转换带来的临时对象成本,可以对operator+进行重载:

    UPInt operator+(int,const UPInt&);
    UPInt operator+(const UPInt&,int);

    3. 2中用函数重载取代隐式类型转换的策略不局限于操作符函数,在string与char*,Complex(复数)与int,double等的兼容方面同样可以采用此策略,但此策略要权衡使用,因为在增加一大堆重载函数不见得是件好事,除非它确实可以使程序效率得到大幅度提高.

  • 相关阅读:
    AddDemo核心代码
    uniapp vuecli 命令行 新建项目 报错关键词:RuleSet
    java maven dependency
    java代码的执行过程
    Spring中Bean的单例和多例
    java代码的执行过程
    Condition
    Java对象初始化过程执行顺序
    线程池不推荐使用 Executors 去创建
    java线程的六种状态
  • 原文地址:https://www.cnblogs.com/reasno/p/4836674.html
Copyright © 2020-2023  润新知