C++编程规范 3 函数

来源:互联网 发布:阿里云 代码托管 编辑:程序博客网 时间:2024/06/05 09:22

3 函数

  3.1  内联函数

规则3.1 内联函数(inline function)小于10行

说明:内联函数具有一般函数的特性,它与一般函数不同之处只在于函数调用的处理。一般函数进行

调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,

是将调用表达式用内联函数体来替换。

内联函数只适合于只有1~10行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对

来说微不足道,也没有必要用内联函数实现,一般的编译器会放弃内联方式,而采用普通的方式调用

函数。

如果内联函数包含复杂的控制结构,如循环、分支(switch)、try-catch等语句,一般编译器将该函数

视同普通函数。虚函数、递归函数不能被用来做内联函数。

规则3.2 使用内联函数代替函数宏

说明:C++中也支持宏的功能,但是宏有其自身固有的缺陷(例如无法对参数进行类型检查),因此,能

使用内联函数的地方,一定不使用宏。

示例:

    //较好的例子:
    template <class TYPE_T> inline TYPE_T& max(TYPE_T& x, TYPE_T& y)
    {
       return (x>y)?x:y;
    }
    //不好的例子:
    #define MAX(x,y)((x)>(y)?(x):(y))
例外:一些通用且成熟的应用,如:对new, delete的封装处理,可以保留对宏的使用。

建议3.1 内联函数应该放在头文件中声明,而且在函数前添加inline关键字

说明:内联函数的定义对编译器而言必须可见,以便在调用点将函数展开。放在头文件中可以保证对

编译器可见,修改或者删除内联函数时,重新编译使用该头文件的所有源文件。

建议3.2 内联函数的实现放在独立的文件

说明:确保接口清晰。如果使用者和维护者看见声明包含大量的内联实现,会干扰他们的思维,降低

声明的可读性和可维护性。所以除了最简单的成员存取函数外,其他较为复杂内联函数的实现放到独

立的头文件中(建议使用.inl为扩展名),在声明头文件的最后include。

    //cpp_rule.h
    #ifndef CPP_RULE_H
    #define CPP_RULE_H

    class CppRule
    {
    public:
       inline inlineFunction();
    };

    #include “cpp_rule.inl”
    #endif  //CPP_RULE_H

    //cpp_rule.inl
    #ifndef CPP_RULE_INL
    #define CPP_RULE_INL

    inline CppRule::inlineFunction()
    {
       //内联函数实现
    }

    #endif //CPP_RULE_INL

  3.2  函数参数

建议3.3 入参尽量用const引用取代指针

说明:引用比指针更安全,因为它一定非空,且一定不会再指向其他目标;引用不需要检查非法的NULL

指针。

如果是基于老平台开发的产品,则优先顺从原有平台的处理方式。

选择const避免参数被修改,让代码阅读者清晰地知道该参数不被修改,可大大增强代码可读性。

建议3.4 消除未使用函数参数

说明:检查未使用的函数参数,确认是否需要使用该函数参数,如果不需要直接删除参数名。

当实现接口时,有一些参数没有被引用是相当常见的。编译器会发现未使用的参数,并产生一个警告,
有些组件甚至会认为这是一个错误。为避免发生如此情况,将未使用的参数使用/* 参数名 */ 语法将

其注释掉。

示例:

    //好的例子:将localityHint参数名去掉,在注释中保留参数名以备参考和理解参数含义
    pointer allocate(size_type numObjects, const void * /* localityHint */ = 0)
    {
       return static_cast<pointer>(mallocShared(numObjects * sizeof(T)));
    }

建议3.5 尽量少用缺省参数

说明:使用参数的缺省值仅仅方便函数的使用,没有赋予函数新的功能,但降低函数的可理解。

缺省参数使得拷贝粘贴以前函数调用的代码难以呈现所有参数,当缺省参数不适用于新代码时可

能导致重大问题。

  3.3  函数指针

建议3.6 尽量少用函数指针

说明:不少代码中还是用函数指针来实现一些功能扩展 (如封装),但函数指针难以理解和

难以维护,建议使用C++中派生与继承的基本用法,少用函数指针。