您的位置:首页 > 编程语言 > C语言/C++

《Effective C++》学习笔记条款26 尽可能延后变量定义式的出现时间

2013-12-29 19:17 447 查看
条款26:尽可能延后变量定义式的出现时间

    只要你定义了一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流到达这个变量定义式时,你便

得承受构造成本;当这个变量离开其作用域时,你便得承受析构成本。即使这个变量最终并为被使用,仍需耗费这些
成本,所以应该尽量避免这种情形。

    std::string encryptPassword(const std::string& password)

    { 

        using namespace std; 
       string encrypted1;

        if (password.length() <MinimumPasswordLength) 

        { 

            throwlogic_error("Password is too short");     //注意:可能抛出异常

        }
       string encrypted2;
        ... 

        return encrypted; 

     } 

     如上代码,encrypted在2处定义是个不错的选择,因为如果抛出异常,那么encrypted的构造和析构可是做了无用
功啊!
   
       还有一点要注意:“通过默认构造函数构造出一个对象然后对它赋值”比“直接在构造函数时制定初值”效率差。
       “尽可能延后”的真正意义应该是:你不只应该延后变量的定义,直到非得使用该变量的前一刻为止,甚至应该尝
试延后这份定义直到能够给它初值实参为止。
    //方法A:定义循环外
    Widget w;

     for (int i = 0; i < n; ++i) 

    { 
       w = somevalue dependent on i;
       ...

    }     //1个构造函数+1个析构函数+n个赋值操作;

    //方法B:定义循环外
     for (int i = 0; i< n; ++i) 

    {
       Widget w(some value dependent on i);  

        ...

    }     //n个构造函数+n个析构函数

    
除非:1.你知道赋值成本比“构造+析构”成本低;2.你正在处理代码中效率高度敏感的部分,否则应该使用方法B。

    
请记住:
尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率。   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息