条款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 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)
;//具体的操作省略
}
二者区别在于:首先,一般而言放在循环体外代码效率更高,因为这样你只需要做一次构造与析构。而在循环体内你得做很多次。其次,在循环体内定义的变量的作用域比较小,易于代码的维护。这取决于你代码所关心的重点:是效率还是安全?
总之,尽可能推后变量定义的出现,最好是在定义时一并赋了初值。
相关文章推荐
- 条款26:尽可能延后变量定义式的出现时间
- 【Effection C++】读书笔记 条款26:尽可能延后变量定义式的出现时间
- Effective C++ 条款26:尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式的出现时间
- effective C++ 条款 26:尽可能延后变量定义式的出现时间
- 《Effective C++》学习笔记条款26 尽可能延后变量定义式的出现时间
- 条款26 尽可能延后变量定义式的出现时间
- Effective C++ -----条款26:尽可能延后变量定义式的出现时间
- 《Effective C++》之条款26:尽可能延后变量定义式的出现时间
- Effective C++:条款26:尽可能延后变量定义式的出现时间
- Effective C++条款26解读: 尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式的出现时间
- Effective C++ 条款26 尽可能延后变量定义式的出现时间
- 《Effect C++》学习------条款26:尽可能延后变量定义式的出现时间
- Effective C++:条款26:尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)
- 条款26:尽可能延后变量定义式的出现时间
- 条款26:尽可能延后变量定义式出现的时间
- 【26】尽可能延后变量定义式的出现时间
- 条款26: 尽可能延后变量定义的出现时间