学习《高质量C++编程指南》--第六章《函数设计》
2013-03-10 21:11
246 查看
返回值的规则
规则(1)函数名字与返回值类型在语义上不可冲突;
规则(2)不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标记用return语句返回;
违反上述两条的典型反例:C的标准库函数:int getchar()
建议(1)有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值;
如strcpy函数,可以strlen(strcpy(str, "HelloWorld"))
建议(2)如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。
函数内部实现的规则
规则(1)在函数体的“入口处”,对参数的有效性进行检查。如使用assert断言。
规则(2)在函数体的“出口处”,对return语句的正确性和效率进行检查。
注意事项:
如果函数返回值是一个对象,要考虑return语句的效率。例如:
String temp(s1 + s2);
return temp;
上述代码将发生三件事:首先,temp对象被创建,同时完成初始化;然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;最后,temp在函数结束时被销毁(调用析构函数)。
return String(s1 + s2);
这是临时对象的语法,表示“创建一个临时对象并返回它”。编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的花费,提高了效率。
使用断言
断言assert是仅在Debug版本起作用的宏。
引用和指针的区别:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化);
(2)不用有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL);
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
int i = 5;
int j = 6;
int &k = i;
k = j;
k还是i的引用,k=j使k和i都变成了6。
规则(1)函数名字与返回值类型在语义上不可冲突;
规则(2)不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标记用return语句返回;
违反上述两条的典型反例:C的标准库函数:int getchar()
建议(1)有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值;
如strcpy函数,可以strlen(strcpy(str, "HelloWorld"))
建议(2)如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。
函数内部实现的规则
规则(1)在函数体的“入口处”,对参数的有效性进行检查。如使用assert断言。
规则(2)在函数体的“出口处”,对return语句的正确性和效率进行检查。
注意事项:
如果函数返回值是一个对象,要考虑return语句的效率。例如:
String temp(s1 + s2);
return temp;
上述代码将发生三件事:首先,temp对象被创建,同时完成初始化;然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;最后,temp在函数结束时被销毁(调用析构函数)。
return String(s1 + s2);
这是临时对象的语法,表示“创建一个临时对象并返回它”。编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的花费,提高了效率。
使用断言
断言assert是仅在Debug版本起作用的宏。
引用和指针的区别:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化);
(2)不用有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL);
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
int i = 5;
int j = 6;
int &k = i;
k = j;
k还是i的引用,k=j使k和i都变成了6。
相关文章推荐
- java核心技术卷I-第六章学习笔记
- 《算法导论》学习笔记--第六章 堆排序
- [DL_BOOK]深度学习 第六章 深度前向网络 [part1]
- Spring MVC 学习指南--- 第六章 converter 和formatter
- 第六章、SpringMVC学习-注解式控制器详解(2)-SpringMVC3强大的请求映射规则详解
- C++ Primer_4th第六章学习笔记
- apue第六章学习总结
- JAVAOOP—第六章(集合框架)学习笔记
- K&R学习笔记 第六章
- AUPE学习第六章------系统数据文件盒信息
- APUE第六章学习笔记
- 2012/1/14 《C++ Primer Plus》第六章:分支语句和逻辑操作符 学习笔记
- 学习ldd3--异步通知(第六章)
- 《快学Scala》第六章——对象 学习笔记
- 第六章 慕课网学习-scrapy的暂停与重启
- 《Python 学习手册4th》 第六章 动态类型简介
- jQuery基础教程第六章学习
- 第六章 ASP.NET应用实例 -- 学习笔记
- C++ Primer学习笔记之第六章--函数
- [Python学习笔记][第六章Python面向对象程序设计]