变量的定义不仅要尽量延后到使用它的时候,而且要延后到能给该变量初始化赋值的时候。
原因如下:
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: