尽可能延后变量定义出现的时间

2018-02-16  本文已影响0人  Magic11

变量的定义不仅要尽量延后到使用它的时候,而且要延后到能给该变量初始化赋值的时候。

原因如下:
1、只要你定义了一个变量,而且其类型带有一个构造函数或析构函数,那么当程序执行到这个变量的定义处 时,就需要承受该变量的构造成本,当程序执行离开该变量的作用域时,又要承受该变量的析构成本。
2、 无法保证你定义一个变量,就一定会使用该变量,考虑如下函数。

string encryptPassword(const std::string& password) {  
    using namespace std;  
    string encrypted;  
    if(password.length() < MinimumPasswordLengt) {  
        throw logic_error(“Password is too short”)  
    }  
    …//必要动作,将一个加密后的密码置入encrypted内。  
    return encypted;  
}  

如果if分支抛出异常,此时变量encrypted就不会被使用,并且需要承受string 的构造和析构成本。
所以应尽量在变量要使用的地方再去定义它,上述函数修改如下:

//这个函数延后“encrypted”的定义,直到真正需要它  
string encryptPassword(const std::string& password) {  
    using namespace std;  
    if(password.length() < MinimumPasswordLengt) {  
        throw logic_error(“Password is too short”)  
    }  
    string encrypted;  
    …//必要动作,将一个加密后的密码置入encrypted内。  
    return encypted;  
}  

3、上述string encrypted; 仍会调用string的缺省构造函数,所以下述代码:

//这个函数延后“encrypted”的定义,直到真正需要它  
//但此函数仍然有着不该有的效率低落
string encryptPassword(const std::string& password) {  
    using namespace std;  
    if(password.length() < MinimumPasswordLengt) {  
        throw logic_error(“Password is too short”)  
    }  
    string encrypted;  
    encrypted = password;
    encrypt(encrypted);
    return encypted;  
}  

最好的做法是以password作为encrypted的初值,跳过毫无意义的缺省构造过程。
这里主要是遵循条款4:

“通过default的构造函数构造出一个对象然后对它赋值”比“直接在构造时指定初值”

上一篇 下一篇

猜你喜欢

热点阅读