C++编程指南学习(六),第1张

C++编程指南学习(六),第2张

第六章函数设计
函数是C++/C程序的基本功能单元,其重要性不言而喻。功能设计的细微缺点很容易导致功能的误用,所以仅仅让功能正确是不够的。本章重点介绍界面设计的一些规则和功能的内部实现。
函数接口的两个要素是参数和返回值。在C中,传递函数的参数和返回值有两种方式:按值传递和按指针传递。C++语言中有许多通过引用传递的方法。由于引用传递的性质像指针传递,但使用方式像值传递,初学者往往会感到困惑,容易造成混乱。请先阅读第6.6节“引用和指针之间的比较”。

6.1参数规则
l[规则6-1-1]参数要写完整。不要为了省事只写参数的类型,省略参数的名称。如果函数没有参数,则用void填充。

例如:

void SetValue(int width,int height);//好的风格

void SetValue(int,int);//错误的样式

float GetValue(void);//好的风格

float GetValue();//错误的样式


l [Rule 6-1-2]参数应该以合理的顺序正确命名。

例如,编写StringCopy函数,它有两个参数。例如,如果将参数命名为str1和str2

void StringCopy(char *str1,char * str 2);

那么我们就很难搞清楚str1是被复制到str2还是反过来。

您可以将参数命名为更有意义的名称,例如strSource和strDestination。从名字可以看出strSource应该是复制到strDestination的。

还有一个问题,这两个参数哪个应该在前,哪个应该在后?参数的顺序要遵循程序员的习惯。一般情况下,目的参数应该放在前面,源参数放在后面。

如果函数声明为:

void StringCopy(char *strSource,char * strDestination);

别人用的时候,可能会不假思索地写成以下形式:

char string
l [Rule 6-1-3]如果参数是指针,只用于输入,那么应该在类型前加const,防止指针在函数体中被意外修改。;

StringCopy(str,“Hello World”);//参数的顺序相反

[20]

例如:

void string copy(char * strDestination,const char * strSource);


l [Rule 6-1-4]如果输入的参数通过值传递给对象,那么最好使用“const &”来传递,这样可以省去临时对象的构造和销毁,从而提高效率。


2【建议6-1-1】避免函数参数过多,尽量将参数个数控制在5个以内。如果参数太多,使用时很容易弄错参数的类型或顺序。


2[建议6-1-2]尽量不要使用类型和个数不确定的参数。

c库函数printf是不确定参数的典型代表,其原型是:

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

这种类型的函数在编译时会失去严格的类型安全检查。

6.2返回值规则
l[规则6-2-1]不要省略返回值的类型。

在C语言中,所有没有类型描述的函数都被自动视为整数。不会有什么好处,反而容易被误解为虚空型。

C++语言有严格的类型安全检查,不允许出现上述情况。因为C++程序可以调用C函数,所以为了避免混淆,规定任何C++/ C函数都必须有一个类型。如果函数没有返回值,应该声明为void类型。


l [Rule 6-2-2]函数名和返回值类型在语义上不能冲突。

违反这一规则的典型代表就是C标准库函数getchar。

例如:

char c;

c = getchar();

if (c == EOF)

根据getchar名字的含义,将变量c声明为char类型是很自然的。可惜getchar不是char类型,而是int类型,其原型如下:

int getchar(void);

因为C是char的一种类型,所以取值范围是[-128,127]。如果宏e of的值超出了char的取值范围,那么if语句将总是失败。一般人哪里会料到这种“危险”?这个例子中的错误不是用户造成的,而是getchar函数误导了用户。


l[规则6-2-3]不要把正常值和错误标志混在一起返回。正常值由输出参数获得,而错误标志由return语句返回。

回过头来看前面的例子,为什么C标准库函数的设计者会把getchar声明为容易混淆的int类型?他会那么蠢吗?

在正常情况下,getchar确实返回单个字符。但是,如果getchar遇到文件结束标志或发生读取错误,它必须返回一个标志EOF。为了区别于普通字符,EOF必须定义为负数(通常为负1)。因此,函数getchar变成了int类型。

在我们的实际工作中,经常会遇到上述尴尬的问题。为了避免误解,我们应该把正常值和错误的符号分开。即正常值由输出参数获得,错误标志由return语句返回。

getchar函数可以重写为BOOL GetChar(char * c);

虽然gechar比GetChar灵活,比如putchar(GetChar());但是如果getchar使用不当,它的灵活性又有什么用呢?

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++编程指南学习(六)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情