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

本文探讨了如何通过推迟变量定义的时间来提高程序效率,并介绍了直接使用理想初始值初始化变量的方法。此外,还讨论了在循环体内与循环体外定义变量的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假如你定义的变量带有构造函数和析构函数,那么你就必须承受它们所带来的成本。

比如下面这个函数,把密码置换为“*“

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)
			;//具体的操作省略
	}

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


总之,尽可能推后变量定义的出现,最好是在定义时一并赋了初值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值