一、引用
一)、基本概念
1、语法:数据类型+&+别名=原名
#include<iostream>
using namespace std;
#include<string>
int main()
{
int a = 10;
int& b = a;
b = 20;
cout << a;
}
2、作用:给变量取别名
3、注意事项:引用必须初始化,就是不能直接一句int &a;
引用不能同时对两段内存空间。就是一个变量可以有多个别名,但是这个别名不能同时是两个变量的别名;引用可以等量代换
int a = 10;
int& b = a;
int& c = b;
二)、引用作函数参数
回顾:之前函数参数的传递方式有值传递(不能修饰实参)和地址传递(指针)(可以修饰实参)
引用由于就相当于指针常量,那么是不是就可以修饰实参呢?
#include<iostream>
using namespace std;
#include<string>
void function(int & b)
{
b = 100;
cout << "b=" << 100 << endl;;
}
int main()
{
int a = 10;
function(a);
cout << "a=" << a;
}
实参a也会改变为100。因为b作为a的别名,那么对b重新赋值访问的是a的地址,a的内存空间,所以引用作函数参数会修饰实参。由于可以赋值,但是只能是一个变量的别名,那就相当于可以改变值,但不能改变指向地址,所以相当于指针常量。int * const p。
#include<iostream>
using namespace std;
#include<string>
void swap(int &c ,int &d)
{
int temp = c;
c = d;
d = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(a,b);
cout << a << endl;
cout << b << endl;
}
三)不能返回局部变量的引用(类比指针,栈区的注意事项),函数的调用可以作为左值存在
1、因为也是通过地址去访问,但是局部变量已经被编译器立即释放了,所以第第一次保留输出,第二次无法输出。但是可以调用函数直接输出。
#include<iostream>
using namespace std;
#include<string>
int & func()
{
int a = 10;
return a;
}
int main()
{
int& b = func();
cout << b << endl;
cout << b << endl;
}
第二次输出乱码。但是将局部变量改为在全局区的静态变量就正常输出
#include<iostream>
using namespace std;
#include<string>
int & func()
{
static int a = 10;
return a;
}
int main()
{
int& b = func();
cout << b << endl;
cout << b << endl;
2、函数的调用作为左值
#include<iostream>
using namespace std;
#include<string>
int & func()
{
static int a = 10;
return a;
}
int main()
{
int& b = func();
cout << b << endl;
cout << b << endl;
func() = 1000;
cout << b << endl;
cout << b << endl;
}
第一次输出是输出a的引用,第二次函数作为a的左值相当于a=1000,那么输出b就相当于输出a。
引用的本质:相当于指针常量(可改值,不能改指向)。
四)、常量引用
1、作用:在函数的形参列表中,利用const修饰引用预防误操作。
相当于const既修饰变量又修饰地址:既不能改值,又不能改指向。
由于b修改,实参a就会修改,但是在更大的程序中不希望a修改,所以会对形参做一个限制,不允许修改它的值。
二、函数
1、默认参数:在形参中提前写入默认参数,在不传入实参时,就默认用形参默认的值
但是默认参数右边参数必须都有默认,不能有有空缺。
函数声明和函数定义默认参数二选一。
函数调用时传入实参的值的优先级大于形参默认值。
2、占位参数:
函数调用时,占位参数必须填补
占位参数也可以有默认值 int=10,这时传递的时候就可以不用填补。
3、函数重载(不能出现二义性)
1)、满足条件:作用域相同,函数名相同,形参不同:类型不同,顺序不同,个数不同
目前阶段我的作用域是全局作用域。
2)、引用作为函数重载的条件
int &和const int &为不同的类型,但是调用时,实参数传入变量则调用参数为int &的函数,实参数传入数值则调用参数为const int &的函数。因为加了const 后参数只可读,不可写。并且int &a=10不合法。
3)、函数默认参数作为重载的条件:避免这种情况,重载时尽量避免默认参数。