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 }
- 注意:
- “默认”之后必须“默认”,也就是说,如果一个形参使用的默认参数,则它后面的形参也必须使用默认参数。例如下面的写法是不允许的
int main() { funct(1, , 3); //本意是想仅使用形参b=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
开头,elif
和else
作为衔接,以#endif
作为结尾
#if ... #ifdef ... #ifndef ... #if #else ... #endif ...
还有其他常用的宏,可以见叶焯仁学长的博客。
头文件的写法
为了解决重复包含的问题,我们可以采用预编译宏来进行控制。以满足one-defination rule
的原则。头文件的常用写法如下——
/*my.h文件*/
#ifndef MY_H
#define MY_H
//头文件体
#endif
这样就可以保证头文件只被包含一次。