高质量C++/C编程指南-第6章-函数设计(3)
当前位置:以往代写 > C/C++ 教程 >高质量C++/C编程指南-第6章-函数设计(3)
2019-06-13

高质量C++/C编程指南-第6章-函数设计(3)

高质量C++/C编程指南-第6章-函数设计(3)

对付相加函数,该当用“值通报”的方法返回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可以辅佐我们找到产生错误的原因。

#p#分页标题#e#

很少有比跟踪到措施的断言,却不知道该断言的浸染更让人沮丧的事了。你化了许多时间,不是为相识除错误,而只是为了弄清楚这个错误到底是什么。有的时候,措施员偶然还会设计出有错误的断言。所以假如搞不清楚断言查抄的是什么,就很难判定错误是呈此刻措施中,照旧呈此刻断言中。幸运的是这个问题很好办理,只要加上清晰的注释即可。这本是显而易见的.

    关键字:

在线提交作业