1、注意:
(1)引用必须初始化
(2)引用在初始化后,不可以改变
int a = 10;
int &b = a; //int &b;为错误,必须初始化
int c = 20;
b = c; //赋值操作,而非更改引用
2、引用做函数参数
void swap(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(a,b); //注意这里不用写引用符号了
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
3、引用做函数返回值
注意:a不要返回局部变量的引用 b函数的调用可以作为左值
int& test1()
{
//引用做函数的返回值
//不要返回局部变量的引用
int a = 10; //局部变量存放在栈区
return a;
}
int& test2()
{
//可以返回静态变量的引用
static int b = 20; //静态变量存放在全局区
return b;
}
int main()
{
int &ref1 = test1();
cout << "ref1=" << ref1 << endl; //输出结果为ref1=10
cout << "ref1=" << ref1 << endl; //输出结果为ref1=1378401248
//因为第二次的内存已经释放
int &ref2 = test2();
cout << "ref2=" << ref2 << endl; //输出结果为ref2=20
cout << "ref2=" << ref2 << endl; //输出结果为ref2=20
test2() = 30;
cout << "ref2=" << ref2 << endl; //输出结果为ref2=30
cout << "ref2=" << ref2 << endl; //输出结果为ref2=30
return 0;
}
4、引用的本质:
(1)int &b = a; 类似于 int * const b = &a;
(2)C++标准并没有规定引用是否占用内存空间,但是大多数编译器都把引用实现为const指针,所以大部分编译器中引用也是要占内存空间的;
(3)引用是天然const的,所以定义时必须初始化指向变量,否则就没意义了;
(4)引用本质是指针,是地址,所以才能实现传址调用的效果;
总结:功能上来说,引用是受限制的指针,相当于用const修饰的指针变量类型;
5、常量引用
int& a=10;//错误,引用本身需要合法的内存空间,因此直接赋值是非法操作
const int& a=10;//正确,加入const后,编译器优化为int temp =10;const int& a = temp;
使用场景:用来修饰形参,防止误操作
void Print(const int& a)
{
//a = 20;为错误
cout << a << endl;
}
int main()
{
int a = 10;
Print(a);
return 0;
}