一、宏函数(带参数的宏定义)缺陷:
-
保证运算完整性、增加()
-
即使加了括号在,传递++ -- 等运算时,仍有可能出错(宏展开,导致++ -- 等不止执行一次)
-
不重视作用域
二、内联函数:在函数声明或定义前加关键字inline 用于请求编译程序将实现该函数的目标代码插入到调用该函数的语句之处,从而消除因函数调用时的时间开销,提高运行速度,牺牲空间换取时间
-
如果在类中定义成员函数,则该函数自动成为内联函数而无需加关键字inline
-
效率高 有条件:①内联编译是建议性(如同register关键字,inline只是请求,而非命令)的,由编译器决定;②逻辑简单,调用频繁的函数建议使用内联;③含有static变量的函数、递归函数、包含循环或有switch、goto的函数无法使用内联方式;
#include <iostream>
using namespace std;
inline int getMax(int i,int j,int k)
{
int max=0;
if(i>j)
max = i;
else if(k>j)
max = k;
else
max = j;
return max;
}
int main()
{
int a=10,b=20,c=30,n; //实际效果: int a=10,b=20,c=30,n;
n= getMax(a,b,c); // int i,j,k;
// i=a;j=b;k=c;
// if(i>j) n = i;
// else if(k>j) n = k;
// else n = j;
cout << n << endl; // cout << n << endl;
return 0;
}
三、函数默认参数
-
可在函数原型中给参数赋默认值,构成可缺省参数的函数
-
函数调用时允许缺省部分或全部实际参数,此时编译器自动以默认值作为相应实参值
-
若想要对已有的函数增加新参数,可将其设为默认参数,以减少对已有代码的改动
#include <iostream>
using namespace std;
//void fun(int i,int j=6,int k);//错误
void fun(int i,int j=6,int k=8);//正确 有默认值的参数必须写在参数表的最右端
void fun(int i,int j,int k) //定义与声明中只能在一处设置默认值(定义时不建议写默认值,声明时建议写明默认值)
{
cout << i << j << k;
}
int main()
{
fun(20); //调用时,无参数使用默认值,有参数覆盖默认值
fun(20,30);
fun(20,30,40);
return 0;
}
四、函数重载:C++允许2个或以上函数使用同一个函数名
-
重载函数必须具有不同的参数列表。即:要么参数类型不同(包括顺序)、要么个数不同、要么个数类型都不同、只有返回值不同的函数不能构成重载
-
重载函数作用域必须相同
-
引用做函数参数时, 加入const与不加const也可构成重载条件
-
函数重载与函数默认参数同时存在时,注意避免二义性
#include <iostream>
using namespace std;
int getMax(int i,int j,int k); //编译器处理:-> getMax_int_int_int()
double getMax(double i,double j,double k); //编译器处理:-> getMax_double_double_double()
int getMax(int i,int j,int k)
{
int max=0;
if(i>j)
max = i;
else if(k>j)
max = k;
else
max = j;
return max;
}
double getMax(double i,double j,double k)
{
double max=0;
if(i>j)
max = i;
else if(k>j)
max = k;
else
max = j;
return max;
}
int main()
{
cout << getMax(2,3,6) << endl;
cout << getMax(3.5,9.5,4.0) << endl; //调用时,必须写清楚参数类型
return 0;
}
/*
练习:使用函数的重载完成返回最大值的方法。
现在有一个数组,定义一个方法getMax(),利用函数的重载,分别实现:
1、随意取出数组中的两个元素,传到方法getMax()中,可以返回较大的一个元素。
2、将整个数组传到方法getMax()中,可以返回数组中最大的一个元素。
*/
#include <iostream>
using namespace std;
/**
*函数功能:返回a和b的最大值
*a和b是两个整数
*/
int getMax(int a, int b)
{
return a > b ? a : b;
}
/**
* 函数功能:返回数组中的最大值
* arr:整型数组
* count:数组长度
* 该函数是对上面函数的重载
*/
int getMax(int arr[],int count = 3)
{
//定义一个变量并获取数组的第一个元素
int a = arr[0];
for(int i = 1; i < count; i++)
{
//比较变量与下一个元素的大小
if(a<arr[i])
{
//如果数组中的元素比maxNum大,则获取数组中的值
a = arr[i];
}
}
return a;
}
int main(void)
{
//定义int数组并初始化
int numArr[3] = {3, 8, 6};
//自动调用int getMax(int a, int b)
cout << getMax(3, 6) << endl;
//自动调用返回数组中最大值的函数返回数组中的最大值
cout << getMax(numArr) << endl;
return 0;
}