本文已参与「新人创作礼」活动,一起开启掘金创作之路。
引用变量、引用形参
引用变量是其他变量的别名。
既然是引用,所以在定义是就必须指明引用变量指的是哪个变量。
int a = 3;
int &r = a;
引用变量定义后不能再引用其他变量,如:
int &r = a;
int &r = b;//(×)
引用变量和被引用变量类型必须匹配
double a;
int &r = a;//(×)
对引用变量的操作就是对被引用变量的操作
#include<iostream>
using namespace std;
int main(){
int a = 3;
int &r = a;
cout << a << "\t" << r << endl;
r = 5;
cout << a << "\t" << r << endl;
return 0;
}
输出:
3 3
5 5
在C语言中,为了交换两个变量的值,要使用指针:
#include<iostream>
using namespace std;
void swap(int *x, int *y){
int t;
t = *x;
*x = *y;
*y = t;
}
int main(){
int a = 3, b = 4;
cout << a << ' ' << b << endl;
swap(&a, &b);
cout << a << ' ' << b << endl;
return 0;
}
但这种方式改变了函数的变量类型,也改变了传递的实参,这样不论是写函数还是调用函数都不方便,而使用引用就简单很多:
#include<iostream>
using namespace std;
void swap(int &x, int &y){
int t;
t = x;
x = y;
y = t;
}
int main(){
int a = 3, b = 4;
cout << a << ' ' << b << endl;
swap(a, b);
cout << a << ' ' << b << endl;
return 0;
}
函数的默认形参、函数重载
函数的默认形参
函数的形参可以有默认值,但是有默认值的形参必须在无默认值形参的右边:
print(char ch, n=1)
add(x=1, y, z=3)//(×)
add(y, x=1, z=3)
函数重载
C++允许一个作用域有同名函数(实际名字是不同的),只要他们形参不同。
C++代码在编译时会根据参数列表对函数进行重命名,例如void Swap(int a, int b)会被重命名为_Swap_int_int,void Swap(float x, float y)会被重命名为_Swap_float_float。当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution) 。c.biancheng.net/view/2206.h…
不同的编译器有不同的重命名方式,这里仅仅举例说明,实际情况可能并非如此。
从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。
int add(int x, int y);
double add(double x, double y);
函数名和形参列表(参数列表)构成了函数的签名
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。
函数重载不能根据返回类型区分函数。
有一种情况要注意:
#include<iostream>
using namespace std;
int add(int x, int y){
return x + y;
}
double add(double x, double y){
return x + y;
}
int main(){
cout << add(3, 5) << endl;
cout << add(3.3, 5.5) << endl;
cout << add(3, 5.5) << endl;//(×)
return 0;
}
因为既可以把3变成double使用第二个函数,也可以把5.5变成int型5使用第一个函数