返回值的规则

规则(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。

 

posted on 2013-03-10 21:11  guoxiang  阅读(179)  评论(0编辑  收藏  举报