当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

高质量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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>高质量C++/C编程指南-第7章-内存管理(6)</b>
  • 高质量C++/C编程指南-第7章-内存管理(7)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(1)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(2)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(3)
  • <b>高质量C++/C编程指南-第8章-C++函数的高级特点(4)</b>
  • <b>高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(1</b>
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(3
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(4
  • <b>高质量C++/C编程指南-第10章-类的担当与组合(1)</b>
  • 高质量C++/C编程指南-第10章-类的担当与组合(2)
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .