类型名 &引用名 = 同类型的某变量名;
此种写法就定义了一个某种类型的引用,并将其初始化为引用某个同类型的变量。“引用名”的命名规则和普通变量相同。例如:int n; int & r = n;r 就是一个引用,也可以说 r 的类型是 int &。第二条语句使得 r 引用了变量 n,也可以说 r 成为了 n 的引用。
#include <iostream> using namespace std; int main() { int n = 4; int & r = n; //r引用了n,从此r和n是一回事 r = 4; //修改r就是修改n cout << r << endl; //输出4 cout << n << endl; //输出4 n = 5; //修改n就是修改r cout << r << endl; //输出 5 int & r2 = r; //r2和r引用同一个变量,就是n cout << r2 << endl; //输出 5 return 0; }
#include <iostream> using namespace std; int n = 4; int & SetValue() { return n; //返回对n的引用 } int main() { SetValue() = 40; //返回值是引用的函数调用表达式,可以作为左值使用 cout << n << endl; //输出40 int & r = SetValue(); cout << r << endl; //输出40 return 0; }SetValue 函数的返回值是一个引用,是 int & 类型的。因此第 6 行使得其返回值成为变量 n 的引用。
#include <iostream> using namespace std; void Swap(int a, int b) { int tmp; //以下三行将a、b值互换 tmp = a; a = b; b = tmp; cout << "In Swap: a = " << a << " b = " << b << endl; } int main() { int a = 4, b = 5; Swap(a, b); cout << "After swaping: a = " << a << " b = " << b << endl; return 0; }在上面的程序中,Swap 函数的返回值类型是 void,因此函数体内可以不写 return 语句。 在不写 return 语句的情况下,函数执行到末尾的
}
才返回。#include<iostream> using namespace std; void Swap(int & a, int & b) { //交换a、b的值 int tmp; tmp = a; a = b; b = tmp; } int main() { int n1 = 100, n2 = 50; Swap(n1, n2); //n1、n2 的值被交换 cout << n1 << " " << n2 << endl; //输出 50 100 }第 11 行,进入 Swap 函数后,a 引用了 n1,b 引用了 n2,a、b 值的改变会导致 n1、n2 值的改变。因此本行会使 n1 和 n2 的值交换。
int n; const int & r = n;上面的语句定义了常引用 r,其类型是 const int &。
int n = 100; const int & r = n; r = 200; //编译出错,不能通过常引用修改其引用的内容 n = 300; //没问题,n的值变为300注意,const T& 和 T& 是不同的类型。T& 类型的引用或 T 类型的变量可以用来初始化 const T & 类型的引用,const T 类型的常变量和 const T & 类型的引用则不能用来初始化 T & 类型的引用,除非进行强制类型转换。例如下面的程序:
void Func(char & r) { } void Func2(const char & r) { } int main() { const char cc = 'a'; char c; const char & rcl = cc; const char & rc2 = c; //char变量可以用来初始化 const char & 的引用 char & r = cc; //编译出错,const char 类型的常变量不能用来初始化 char & 类型的引用 char & r2 = (char &)cc; //没问题,强制类型转换 Func(rcl); //编译出错,参数类型不匹配 Func2(rcl); //没问题,参数类型匹配 return 0; }
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有