引用是C++中一种重要的复合类型,它为已存在的变量提供了一个别名。引用本质上是对另一个变量的间接访问方式,但与指针不同,引用提供了更安全、更直观的语法。
基本语法
类型 &引用名 = 被引用变量;
举例说明:
int x = 10;
int &ref = x; // ref是x的引用(别名)
ref = 20; // 给ref赋值为20,现在x的值变为20
cout << x; // 输出20
下面通过几个具体的例子来详细说明C++中引用的使用和特性:
示例1:基本引用使用
#include
using namespace std;
int main() {
int num = 42;
int &ref = num; // ref是num的引用(别名),初始化,声明时绑定到有效变量num
cout << "num: " << num << endl; // 输出42
cout << "ref: " << ref << endl; // 输出42
ref = 100; // 通过引用修改值
cout << "修改后 num: " << num << endl; // 输出100
// 验证它们的内存地址相同
cout << "&num: " << &num << endl;
cout << "&ref: " << &ref << endl; // 输出相同的地址
return 0;
}
输出:
num: 42
ref: 42
修改后 num: 100
&num: 0x7ffd4a3b5a24
&ref: 0x7ffd4a3b5a24
说明:
ref 和 num 是同一块内存的别名,修改 ref 等同于修改 num。
引用和原变量的地址相同。
示例2:引用必须在声明时初始化
int main() {
int x = 10;
int &ref1 = x; // 正确:声明时初始化
int &ref2; // 错误:引用必须初始化(编译报错)
return 0;
}
说明:
引用必须在定义时绑定到一个已存在的变量,不能先声明后赋值。
示例3:函数参数传递(避免拷贝)
#include
using namespace std;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int m = 5, n = 10;
swap(m, n); // 传递引用,直接修改原值
cout << "m: " << m << ", n: " << n << endl; // 输出 m: 10, n: 5
return 0;
}
输出:
m: 10, n: 5
说明:
函数参数使用引用时,可以直接修改实参的值(类似指针但语法更简洁)。
避免了值传递时的拷贝开销(对大型对象尤其重要)。
示例4:引用 vs 指针
#include
using namespace std;
int main() {
int val = 50;
// 指针方式
int *ptr = &val;
ptr = 60; // 需要解引用操作符( )
// 引用方式
int &ref = val;
ref = 70; // 无需解引用,直接使用
cout << "val: " << val << endl; // 输出70
return 0;
}
说明:
引用比指针更安全(无空引用风险)且语法更直观。
示例5:常量引用(避免修改)
#include
using namespace std;
void printValue(const int &r) {
// r = 100; // 错误:不能通过常量引用修改值
cout << "值: " << r << endl;
}
int main() {
int x = 42;
printValue(x); // 安全传递,避免拷贝
return 0;
}
说明:
const int & 表示只读引用,适用于不希望函数修改实参的场景。
常用于传递大型对象(如std::string)以避免拷贝开销。
示例6:引用不能重新绑定
int main() {
int a = 1, b = 2;
int &ref = a;
ref = b; // 这是将b的值赋给a,而非让ref改为引用b!
cout << a; // 输出2(a的值被修改为2)
return 0;
}
说明:
引用一旦初始化后,不能再绑定到其他变量。ref = b 是赋值操作,而非重新绑定。
引用的特点总结
别名性质:引用不是独立的对象,它只是已存在变量的另一个名字,引用和原变量共享同一内存地址。
做函数参数:引用传递可避免拷贝,且能修改实参(若需只读则加const)。
必须初始化:引用在声明时必须初始化,声明时需绑定到有效变量;且之后不能改变绑定的对象,减少了意外修改的风险。
安全性(无空引用):引用必须绑定到一个有效的对象(指向有效对象),不存在"空引用",避免了空指针风险。
自动解引用:使用引用时不需要特殊语法,就像使用普通变量一样,不需要解引用操作符(*)。