zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux 总结一下git reset的各个选项吧
    深入C++的new
    Android中binderDied()以及"Unknown binder error code" 出现的原因说明
    C/C++语言void及void指针深层探索
    Android 不通过USB数据线调试的方法
    Android Browser Gallery3D无法两指手势缩放
    Android eMMC Booting
    android基础知识13:AndroidManifest.xml文件解析
    Package sunjava6jdk is not available Ubuntu 10.04 LTS 安装sunjava6jdk ,出现错误
    SQL Server 2008中Service Broker基础应用(上)
  • 原文地址:https://www.cnblogs.com/fangshenghui/p/2533538.html
Copyright © 2011-2022 走看看