您的位置:首页 > 其它

条款26:尽可能延后变量定义式的出现时间

2012-09-11 11:21 267 查看
假如你定义的变量带有构造函数和析构函数,那么你就必须承受它们所带来的成本。
比如下面这个函数,把密码置换为“*“

string encrytPassword(const string password)
{
string::size_type miniLength = 4;
using namespace std;
string encryted;
if(password.length() < miniLength)
throw logic_error(" password is too short");
for(string::size_type i = 0; i < password.size();++i)
encryted.append ("*");
return encryted;
}

我们规定了密码长度不得小于4,如果小于4则会丢出异常。仔细考究就会发现,假如密码长度真的小于4,就不会执行后面的部分,所以string encryted;就不会被使用了。那么前面定义的工作也就白做了。况且这个定义还调用了string的默认构造函数。所以,我们应该延后这个变量出现的时间,把它放在throw logic_error一句的后面。

其实,这样做也不是最好的,因为你毕竟还是先调用了默认构造函数,然后再不停的向里面添加值。最好的作法是直接用理想的初值初始化这个变量,从而跳过毫无意义的默认构造函数:
string encrytPassword(const string password)
{
string::size_type miniLength = 4;
using namespace std;

if(password.length() < miniLength)
throw logic_error(" password is too short");
string encryted((password.length()),'*');
return encryted;
}

所以,准确的说,我们要尽可能的后延变量出现的时间,直到我们非得使用它为止,甚至,直到我们知道他的确切初值时为止。这样不仅可以避免不必要的构造和析构,而且能避免不必要的默认构造函数的调用。而且,一个初值明确的变量能大大提高程序的可读性。
还有一种情况需要仔细考虑:是把变量定义放在for循环中,还是放在for循环之外?

for(int i = 0 ; i < 5; ++i)
{
Test t;
if(t.getVal() == i)
;//具体的操作省略
}

Test t1;
for(int i = 0; i < 5;++i)
{
if(t1.getVal() == i)
;//具体的操作省略
}

二者区别在于:首先,一般而言放在循环体外代码效率更高,因为这样你只需要做一次构造与析构。而在循环体内你得做很多次。其次,在循环体内定义的变量的作用域比较小,易于代码的维护。这取决于你代码所关心的重点:是效率还是安全?

总之,尽可能推后变量定义的出现,最好是在定义时一并赋了初值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string stdstring 工作