C高级(3)--函数设计

第四章 函数设计
函数的接口设计+内部实现的一些规则。
a。函数接口:参数+返回值
参数和返回值的传递方式:值传递+指针传递。。C++ 语言中多了引用
传递(pass by reference)。由于引用传递的性质象指针传递,而使用方式却象值传递,初学者常常迷惑不解,容易引起混乱。
参数的规则:
1.如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。void StringCopy(char *strDestination,const char *strSource);
2.尽量不要使用类型和数目不确定的参数。
  返回值的规则:
1.C 语言中,凡不加类型说明的函数,一律自动按整型处理。却容易被误解为void 类型。
2.C++语言有很严格的类型安全检查。
C 标准库函数的设计者为什么要将getchar 声明为令人迷糊的int 类型??在正常情况下,getchar 的确返回单个字符。但如果getchar 碰到文件结束标志或发生读错误,它必须返回一个标志EOF。为了区别于正常的字符,只好将EOF 定义为负数(通常为负1)。因此函数getchar 就成了int 类型。
3.有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。strlen、strcpy。
4.如果函数返回值是一个对象,使用“引用传递”代替“值传递”提高效率。
b。函数内部实现的规则
规则1:在函数体的“入口处”,对参数的有效性进行检查。应该充分理解并正确使用“断言”(assert)来防止此类错误。
规则2:在函数体的“出口处”,对return 语句的正确性和效率进行检查。return 语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数
体结束时被自动销毁。
尽量避免函数带有“记忆”功能。static 局部变量是函数的“记忆”存储器。建议尽量少用static 局部变量,除非必需。
使用断言:程序一般分为Debug版本和Release版本。断言assert仅在debug版本起作用的宏。在函数的入口处,使用断言检查参数的有效性(合法性)。
c。引用与指针的比较
1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
以下是“值传递”的示例程序。由于Func1 函数体内的x 是外部变量n 的一份拷贝,改变x 的值不会影响n, 所以n 的值仍然是0。
void Func1(int x)
{
x = x + 10;
}
int n = 0;
Func1(n);
cout << “n = ” << n << endl; // n = 0
以下是“指针传递”的示例程序。由于Func2 函数体内的x 是指向外部变量n 的指针,改变该指针的内容将导致n 的值改变,所以n 的值成为10。
void Func2(int *x)
{
(* x) = (* x) + 10;
}
int n = 0;
Func2(&n);
cout << “n = ” << n << endl; // n = 10
以下是“引用传递”的示例程序。由于Func3 函数体内的x 是外部变量n 的引用,x 和n 是同一个东西,改变x 等于改变n,所以n 的值成为10。
void Func3(int &x)
{
x = x + 10;
}
int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10
对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?
答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值