返回值的规则
规则(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。