函数重载
本质上内部函数名字不一样。
#include<iostream>
using namespace std;
//extern "C" 表示内部函数名字不被修改
//extern "C" void print(int a[],int n)
void print(int a[],int n){
for(int i=0;i<n;i++){
cout<<a[i]<<' ';
}
cout<<endl;
}
void print(int a[],int n,char sep){
for(int i=0;i<n;i++){
cout<<a[i]<<sep;//(i==n-1?'\n':sep);
}
//cout<<a[n-1];
cout<<"\b "<<endl;//
//cout<<endl;
}
void print(int a[],int n,char sep,bool bra){
if(bra) cout<<'[';
if(n>0) cout<<*a;
for(int i=1;i<n;i++){
cout<<sep<<a[i];
}
if(bra) cout<<']';
cout<<endl;
}
int main()
{
int a[5]={11,22,33,44,55};
print(a,5); //11 22 33 44 55
print(a,5,','); //11,22,33,44,55//三种方法:1.先打印前n-1个数,在打隐第n个数。2.判断:(i=n-1?'\n':sep);3.cout<<"\b "<<endl;
print(a,5,',',true);//[11 22 33 44 55]
print(a,5,',',false);
}
通过加入函数默认值来代替函数重载
#include<iostream>
using namespace std;
//void print(int a[],int n,char sep=' ',bool bra=false);//若声明时使用默认值,则定义不要再重复使用默认值
//形参默认值靠右摆放。
void print(int a[],int n,char sep=' ',bool bra=false){//默认值
if(bra) cout<<'[';
if(n>0) cout<<*a;
for(int i=1;i<n;i++){
cout<<sep<<a[i];
}
if(bra) cout<<']';
cout<<endl;
}
/*
//extern "C" 表示内部函数名字不被修改(通过汇编代码查看)
//extern "C" void print(int a[],int n)
void print(int a[],int n){//
print(a,n,' ',false);
}
void print(int a[],int n,char sep){
print(a,n,sep,false);
}
*/
int main()
{
int a[5]={11,22,33,44,55};
print(a,5); //11 22 33 44 55
print(a,5,','); //11,22,33,44,55//三种方法:1.先打印前n-1个数,在打隐第n个数。2.判断:(i=n-1?'\n':sep);3.cout<<"\b "<<endl;
print(a,5,',',true);//[11 22 33 44 55]
print(a,5,',',false);
}
避免如下情况
#include<iostream>
using namespace std;
int f(int a){return a*a;}
int f(int a,int b=1){return a*b;}
int main()
{
//cout<<f(10)<<endl;找不到该调谁
cout<<f(10,21)<<endl;
}
内联函数
C++中提倡使用inline代替函数宏。使用const代替常量宏。使用引用代替指针。
#include<iostream>
using namespace std;
//内联函数
inline void f1(){
cout<<"call f1\n";
}
inline int f2(int n){return n*n;}
inline int f3(int n){if(n<2)return 1;return n*f3(n-1);}
int main()
{
f1();
cout<<f2(10)+f3(6)<<endl;
}