考虑如下代码
std::string encryptPasswd(const std::string& passwd) {
using namespace std;
string encrypted;
if (password.length() > MinimumPasswordLength) {
throw logic_error("Passwd is too short");
}
// ...
return encryted;
}
上述函数中的encrypted
对象未完全使用,当encryptPasswd
丢出异常时,仍需要付出encrypted
的构造和析构成本,所以最好延后encrypted
的定义式,如下:
std::string encryptPasswd(const std::string& passwd) {
using namespace std;
if (password.length() > MinimumPasswordLength) {
throw logic_error("Passwd is too short");
}
// ...
string encrypted;
return encryted;
}
但是上述代码仍然不够好,因为encrypted
虽获定义却无任何实参作为初值,这意味着调用的是其default
构造函数,条款4曾解释:“通过default
构造函数构造出一个对象然后对它赋值比[直接在构造时指定初值]效率差”
但是遇到循环时候怎么办?考虑如下代码:
// 形式A:定义于循环外
Widget w;
for (int i = 0; i < n; i++) {
w = 取决于i的某个值;
// ...
}
// 形式B:定义于循环内
for (int i = 0; i < n; i++) {
Widget w(取决于i的某个值);
// ...
}
做法A:1个构造函数 + 1个析构函数 + n个赋值操作
做法B:1个构造函数 + 1个析构函数
如果classes
的一个赋值成本低于一组构造+析构函数,做法A大体而言比较高效,尤其n很大的时候,否则做法B或许比较好;