c++ 函数设计

参数的规则

(a)参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void填充。

(b)参数命名要恰当,顺序要合理。例如编写字符串拷贝函数StringCopy,它有两个参数。把参数名字起为 strSource和strDestination。这样从名字上就可以看出应该把strSource拷贝到strDestination。

(c)如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。

(d)如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。

(e)避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。

(f)尽量不要使用类型和数目不确定的参数。C标准库函数printf是采用不确定参数的典型代表,其原型为:

int printf(const chat *format[, argument]…);

这种风格的函数在编译时丧失了严格的类型安全检查。

返回值的规则

(a) 不要省略返回值的类型.

(b) 函数名字与返回值类型在语义上不可冲突。

(c)函数名字与返回值类型在语义上不可冲突。

(d)不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。

(e)有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。

(f)如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。

函数内部实现的规则

不同功能的函数其内部实现各不相同,看起来似乎无法就“内部实现”达成一致的观点。但根据经验,我们可以在函数体的“入口处”和“出口处”从严把关,从而提高函数的质量。

(a)在函数体的“入口处”,对参数的有效性进行检查。

//很多程序错误是由非法参数引起的,我们应该充分理解并正确使用“断言”(assert)来防止此类错误。

(b)在函数体的“出口处”,对return语句的正确性和效率进行检查。

//如果函数有返回值,那么函数的“出口处”是return语句。我们不要轻视return语句。如果return语句写得不好,函数要么出错,要么效率低下.

注意事项如下:

(1)return语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁.

(2)要搞清楚返回的究竟是“值”、“指针”还是“引用”

(3) 如果函数返回值是一个对象,要考虑return语句的效率。

 

建议与注意:

(1)函数的功能要单一,不要设计多用途的函数.

(2)函数体的规模要小,尽量控制在50行代码之内。

(3)尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。

//带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。这样的函数既不易理解又不利于测试和维护。在C/C++语言中,函数的static局部变量是函数的“记忆”存储器。建议尽量少用static局部变量,除非必需。不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,例如全局变量、文件句柄等.用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。

(4)输入参数,是函数的调用者,传递给函数的实现者,对函数来说,是函数外部传入给函数内部使用的 

(5)输出参数,是函数的实现者,传递给函数的调用者,对函数来说,是函数内部返回给函数外部的 

(6)需要说明的是,有些参数,即是输入参数又是输出参数

(7)输出参数可以有多个,返回值只能有一个 

(8)输出参数有时候又是输入参数,返回值没有这种情况 

(9)当函数只有一个输出时,即可以采用输出参数的方式,也可以用返回值的方式。

(10)输入函数要有初始化,而输入函数不必要有初始化,但是假如既是【in/out】参数则一定要先初始化。

 

引用与指针的比较:

引用是C++中的概念,n是m的一个引用(reference),m是被引用物(referent)。

int m;

int &n = m;

//n相当于m的别名(绰号),对n的任何操作就是对m的操作。所以n既不是m的拷贝,也不是指向m的

其实n就是m它自己。

引用的一些规则如下:

(a)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

(b)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

(c)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

//引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

                                

                                                                                                                             江西理工大学 理学院 Sherwin 2009-2-21 18:41

posted @ 2012-06-04 02:33  xyecho  阅读(1110)  评论(0编辑  收藏  举报