zoukankan      html  css  js  c++  java
  • 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等的兼容方面同样可以采用此策略,但此策略要权衡使用,因为在增加一大堆重载函数不见得是件好事,除非它确实可以使程序效率得到大幅度提高.

  • 相关阅读:
    Django修改数据库时出错 django.db.utils.OperationalError: (1091, "Can't DROP 'content'; check that column/key exists")
    ini配置文件必知
    常用的两个批处理
    windows Path变量优先级
    curl开源库编译
    VS属性页的目录类型
    连通域去噪
    C++调用V8与JS交互
    VS2010,Qt插件安装使用
    utf8转gbk,libcurl中文乱码处理
  • 原文地址:https://www.cnblogs.com/reasno/p/4836674.html
Copyright © 2011-2022 走看看