C++中对C语言在函数使用方面做了很大的升级
一﹑内联函数
1.C++中推荐使用内联函数来替代宏片段代码
2.C++中使用关键字inline声明内联函数
例如:
inline int func(int a, int b) { return (a > b)?a:b; }
需要注意的地方:
a.内联函数声明时inline关键字必须和函数体定义的地方结合在一起,否则编译器会忽视内联请求
b.当然如果在声明的时候对进行一些处理,那么编译器还是可以对函数的进行内联请求的,声明的时候需要加上 __attribute__((always_inline))
c.内联函数虽然是对代码进行替换,但是是有参数检查的,所以这是在编译阶段进行的,要区别于宏(与编译阶段进行)
3.内联函数编译的限制
a.不能存在任何形式的循环语句
b.不能存在过多的条件判断
c.函数体不能过于庞大
d.不能对函数进行取址操作
e.内联函数的使用之前必须声明
二﹑函数的默认参数
1.C++在对函数进行声明的时候可以指定函数参数的默认值,举例如下
#include <iostream> using namespace std; int add(int i = 1,int j = 2); int main(void) { int result = 0 ; result = add(1,1); cout<<"i + j ="<<result<<endl; result = add(); cout<<"i + j ="<<result<<endl; return 0; } int add(int i,int j) { return i+j; }
下面的例子是一样的
#include <iostream> using namespace std; int add(int i = 1,int j = 2) { return i+j; } int main(void) { int result = 0 ; result = add(1,1); cout<<"i + j ="<<result<<endl; result = add(); cout<<"i + j ="<<result<<endl; return 0; }
注意的地方:
a.一旦在一个函数调用中开始使用默认参数值,,那么这个参数后的所 那么这个参数后的所
有参数都必须使用默认参数值
b.占位参数只有参数类型声明,,而没有参数名声明,占位参数只为功能扩展所用(个人理解)
三﹑函数的重载
1.函数重载的特点
a.用同一个函数名定义不同的函数
b.当函数名和不同的参数搭配时函数的含义不同
c.当返回值类型不同的时候,不能看作函数重载(函数返回值不能作为函数重载的依据)
2.函数指针遇到函数重载会怎样做呢? 看一个实例
#include <iostream> using namespace std; int fun(int a) { int m = a; cout<<"m = "<<m<<endl; } int fun(int a,int b) { int m = a + b; cout<<"m = "<<m<<endl; } int fun(int a,int b,int c) { int m = a + b +c; cout<<"m = "<<m<<endl; } int main(int argc,char* argv[]) { typedef int(*FUN)(int); typedef int(*FUN1)(int,int); typedef int(*FUN2)(int,int,int); FUN p = fun; FUN1 p1 = fun; FUN2 p2 = fun; p(1); p1(1,1); p2(1,1,1); return 0; }
打印的内容如下:
m = 1 m = 2 m = 3
所以可以总结出:
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
这是编译器在编译的时候进行的.
四﹑C和C++的互相调用
当在进行大项目开发的时候,我们经常能够碰到这样的问题,有些组员使用的C开发的,而有的组员使用的是C++开发的,那么我们如何实现C和C++的互相调用呢?
虽然C++编译器能够兼容C语言的编译方式,,但但C++编译器
会优先使用C++的方式进行编译
利用extern关键字强制让C++编译器对代码进行C方式编译