高质量C++/C编程指南-第6章-函数计划(3)[VC/C++编程]
本文“高质量C++/C编程指南-第6章-函数计划(3)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于相加函数,该当用“值传送”的方法返回String对象.假如改用“引用传送”,那么函数返回值是一个指向部分对象temp的“引用”.由于temp在函数完毕时被自动销毁,将招致返回的“引用”无效.比方:
c = a + b;
此时 a + b 并不返回盼望值,c什么也得不到,流下了隐患.
6.3 函数内部实现的法则
差别功效的函数其内部实现各不相同,看起来仿佛无法就“内部实现”达成一致的概念.但按照经验,我们可以在函数体的“进口处”和“出口处”从严把关,从而提高函数的质量.
l 【法则6-3-1】在函数体的“进口处”,对参数的有效性举行查抄.
很多程序错误是由不法参数惹起的,我们应当充分理解并精确利用“断言”(assert)来避免此类错误.详见6.5节“利用断言”.
l 【法则6-3-2】在函数体的“出口处”,对return语句的精确性和效率举行查抄.
假如函数有返回值,那么函数的“出口处”是return语句.我们不要轻蔑return语句.假如return语句写得不好,函数要末出错,要末效率低下.
注意事项以下:
(1)return语句不可返回指向“栈内存”的“指针”大概“引用”,因为该内存在函数体完毕时被自动销毁.比方
char * Func(void)
{
char str[] = “hello world”; // str的内存位于栈上
…
return str; // 将招致错误
}
(2)要搞清楚返回的毕竟是“值”、“指针”还是“引用”.
(3)假如函数返回值是一个对象,要考虑return语句的效率.比方
return String(s1 + s2);
这是暂时对象的语法,表示“成立一个暂时对象并返回它”.不要认为它与“先成立一个部分对象temp并返回它的后果”是等价的,如
String temp(s1 + s2);
return temp;
实质不然,上述代码将发生三件事.首先,temp对象被成立,同时完成初始化;然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;最后,temp在函数完毕时被销毁(调用析构函数).但是“成立一个暂时对象并返回它”的历程是差别的,编译器直接把暂时对象成立并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率.
近似地,我们不要将
return int(x + y); // 成立一个暂时变量并返回它
写成
int temp = x + y;
return temp;
由于内部数据范比方int,float,double的变量不存在构造函数与析构函数,固然该“暂时变量的语法”不会提高多少效率,但是程序越发简便易读.
6.4 别的倡议
2 【倡议6-4-1】函数的功效要单一,不要计划多用处的函数.
2 【倡议6-4-2】函数体的规模要小,尽大概掌握在50行代码之内.
2 【倡议6-4-3】尽大概避免函数带有“记忆”功效.相同的输入该当产生相同的输出.
带有“记忆”功效的函数,其行为大概是不可猜测的,因为它的行为大概取决于某种“记忆状况”.这样的函数既不易理解又不利于测试和保护.在C/C++语言中,函数的static部分变量是函数的“记忆”存储器.倡议尽大概罕用static部分变量,除非必须.
2 【倡议6-4-4】不但要查抄输入参数的有效性,还要查抄通过别的途径进入函数体内的变量的有效性,比方全局变量、文件句柄等.
2 【倡议6-4-5】用于出错处理的返回值一定要清楚,让利用者不简单轻忽或曲解错误情形.
6.5 利用断言
程序普通分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户利用.
断言assert是仅在Debug版本起作用的宏,它用于查抄“不该该”发生的情形.示例6-5是一个内存复制函数.在运行历程中,假如assert的参数为假,那么程序就会中止(普通地还会呈现提醒对话,阐明在什么地方引发了assert).
void *memcpy(void *pvTo, const void *pvFrom, size_t size)
{
assert((pvTo != NULL) && (pvFrom != NULL)); // 利用断言
byte *pbTo = (byte *) pvTo; // 避免改变pvTo的地址
byte *pbFrom = (byte *) pvFrom; // 避免改变pvFrom的地址
while(size -- > 0 )
*pbTo ++ = *pbFrom ++ ;
return pvTo;
}
示例6-5 复制不重叠的内存块
assert不是一个仓促凑合起来的宏.为了不在程序的Debug版本和Release版本惹起差别,assert不该该产生任何副作用.所以assert不是函数,而是宏.程序员可以把assert当作一个在任何系统状况下都可以安全利用的无害测试手段.假如程序在assert处终止了,并非说含有该assert的函数有错误,而是调用者出了不对,assert可以帮忙我们找到发生错误的缘由.
很少有比跟踪到程序的断言,却不知道该断言的作用更让人懊丧的事了.你化了很多时间,不是为了解除错误,而只是为了弄清楚这个错误毕竟是什么.有的时刻,程序员无意还会计划出有错误的断言.所以假如搞不清楚断言查抄的是什么,就很难判断错误是呈目前程序中,还是呈目前断言中.幸运的是这个问题很好办理,只要加上清楚的注释便可.这本是显而易见的.
以上是“高质量C++/C编程指南-第6章-函数计划(3)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |