引用(reference)
引用就是别名的意思
机器猫 小叮当 哆啦A梦
龙血武姬 龙女 希瓦娜
都是指的是同一个东西
引用的语法
引用既可以指向变量,也可以指向常量int num = 1;int& r_num = num;//num的应用const int& cr = 10;//常量的引用
类型名& 引用名 = …; 引用必须初化
//以上的代码就是相当于给等号右边的内容起一个别名
引用一旦初始化,引用的对象不能改变,终身为其服务,常量的应用题必须用const修饰。
引用作为函数的参数和返回值作为函数参数
普通变量作为函数的参数只能实现值的单向传递
引用作为函数参数可以实现值的双向传递
作为函数的返回值一般函数的返回值只能作为右值
重载
函数重载
C++编译器和C编译器对函数的处理有区别
1.C++中参数列表为()表示没有参数,等同于(void)
2.C++不支持隐式声明,必须前置声明
3.C++的函数不再默认返回int,必须指定返回值类型
4.C++的函数调用匹配不但匹配函数名,还匹配参数列表
概念
C++中函数名相同,形参列表不同的函数构成重载关系,C语言不支持,所谓形参列表不同:
参数个数不同
参数类型不同
参数顺序不同
void print();
void print(int);
void print(double);
void print(int,double);
void print(double,int);
重载函数的调用
调用重载函数时,根据传递的实参来选择合适的函数调用。
原理:
C++编译函数时不但记录函数名,还会记录参数列表
函数调用时不但匹配函数名,还匹配参数列表
函数重载的意义
对于类似功能,在不同的数据下可以用一个函数名实现,大大简化了上层调用的复杂度。
练习:
使用函数重载实现两个数的加法(add),两个数可以使两个整数,两个双精度浮点数,也可以是一个双精度浮点数和一个整数。
/*01-函数重载*/
#include <iostream>using namespace std;//以下函数构成重载关系
void print()
{cout<<"print()"<<endl;
}void print(int a)
{cout<<"print(int)"<<endl;
}void print(double a)
{cout<<"print(double)"<<endl;
}void print(int a,double b)
{cout<<"print(int,double)"<<endl;
}void print(double a,int b)
{cout<<"print(double,int)"<<endl;
}int main()
{print();print(1);print(3.15);print(2,4.6);print(1.5,7);//print(12,23);return 0;
}
哑元
如果一个形参只有类型,没有形参名,这种参数就叫哑元
int print(int/哑元/)
{
//…
}
哑元的作用就是实现参数没有区别的函数的重载
/*03-哑元*/
#include <iostream>using namespace std;void print()
{cout<<"print()"<<endl;
}void print(int/*哑元*/)
{cout<<"print(int)"<<endl;
}int main()
{print();print(1);return 0;
}
Train
/*02-加法函数的重载*/
#include <iostream>using namespace std;int add(int a,int b)
{cout<<"add(int,int)"<<endl;return a+b;
}double add(double a,double b)
{cout<<"add(double,double)"<<endl;return a+b;
}double add(int a,double b)
{cout<<"add(int,double)"<<endl;return a+b;
}double add(double a,int b)
{cout<<"add(double,int)"<<endl;return a+b;
}int main()
{cout<<add(1,2)<<endl;cout<<add(1.1,2)<<endl;cout<<add(1.1,2.2)<<endl;cout<<add(1,2.2)<<endl;return 0;
}
练习
设计一个打印整数数组的函数,默认打印前5个元素,默认使用逗号作为分隔符,也可以指定打印个数和分隔符
/*05-打印数组*/
#include <iostream>using namespace std;void print_arr(int *a,int n=5,char op=',')
{//打印到倒数第二个for(int i=0;i<n-1;i++)cout<<a[i]<<op;//打印最后一个cout<<a[n-1]<<endl;
}int main()
{int arr[] = {1,2,3,4,5,6,7,8,9};print_arr(arr);print_arr(arr,7);print_arr(arr,3,' ');print_arr(arr,7,'-');return 0;
}