「BUAA-C++」Lec1:C++函数的特性和常用的宏


C++函数

函数重载(overloading)

  • 函数重载就是允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,即“同名函数,不同参数”, 例如
    void print(int i) {}
    void print(char *i) {}
  • 同名函数,相同参数,返回值不同”不能成为重载函数,例如
    int print() {}
    char* print() {}

    也就是说,不能通过返回值类型区分同名函数

默认参数(default parameter)

  • 在C++函数中,可以为函数的形参设定一个默认值,例如
    void funct(int a, int b = 2, int k = 3) {}

    函数调用时,如果需要使用默认参数,那么该位置不传参即可,例如
    int main() {
        funct(1, 2); //使用默认参数 k = 3
    }
  • 注意:
    1. “默认”之后必须“默认”,也就是说,如果一个形参使用的默认参数,则它后面的形参也必须使用默认参数。例如下面的写法是不允许的
      int main() {
          funct(1, , 3); //本意是想仅使用形参b=2,但是这样写是不允许的
      }
    2. 头文件中定义了默认参数,则源文件中不允许再次定义,例如
      /*.h文件*/
      void funct(int mode = 0);
        
      /*.cpp文件*/
      void funct(int mode = 0); //错误,重新定义的默认参数
      void funct(int mode); //正确

占位参数

占位参数就是,函数声明或定义时,某个形参只有类型声明,而没有参数名。

  • 一种情况是,函数在声明时有占位参数,而定义时补全了这个占位参数的名字,这样函数体内部时可以使用这个参数的。

    //声明
    int funct(int a, int )
    //定义
    int funct(int a, int b) {
        return a + b;
    }

  • 另一种情况是,函数的定义中仍然有占位参数,那么函数体内部是无法使用占位参数的(没有名字怎么使用?)。但即使不能使用,在函数调用是占位参数也必须填补(流氓行为)。

    int funct(int a, int b, int ) {
        return a + b;
    }
    
    int main() {
        cout << funct(1, 2, 3); //虽然这个3没有什么用,但是也要加上
    }

    当然可以在占位参数那里运用默认参数,这样在调用函数是就可以不用补全占位参数了。(但是好像并没有什么用...)
    int funct(int a, int b, int =3) {
        return a + b;
    }
    
    int main() {
        cout << funct(1, 2, 3); //虽然这个3没有什么用,但是也要加上
    }

宏(macro)

  • 常量宏
    #define PI 3.14
  • 宏函数
    #define ARRAY_SIZE (sizeof(a)/sizeof(a[0]))
    #define ADD(a,b) ((a)+(b))
  • 预编译控制宏
    一种是类似于if-else的写法,以#if,#ifdef,#ifndef开头,elifelse作为衔接,以#endif作为结尾
    #if ...
    #ifdef ...
    #ifndef ...
    #if
    #else ...
    #endif ...

    还有其他常用的宏,可以见叶焯仁学长的博客

头文件的写法

为了解决重复包含的问题,我们可以采用预编译宏来进行控制。以满足one-defination rule的原则。头文件的常用写法如下——

/*my.h文件*/
#ifndef MY_H
#define MY_H 

//头文件体

#endif

这样就可以保证头文件只被包含一次。


文章作者: Hyggge
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hyggge !
  目录