C++ 引用初始化
引用的概念
引用(Reference)是C++中一个非常重要的特性,它为已存在的变量创建了一个"别名"。通过引用,我们可以使用不同的名称访问同一块内存空间。引用必须在创建时进行初始化,并且一旦初始化后,它就无法再绑定到其他对象上。
引用初始化基础
语法形式
引用的初始化语法非常简单:
数据类型 &引用名 = 被引用的变量;
例如:
int original = 10; // 原始变量
int &ref = original; // 引用初始化,ref引用了original
在这个例子中,ref
成为了original
的一个别名。无论我们修改ref
还是original
,它们都指向同一个内存位置的值。
让我们看一个完整的例子:
#include <iostream>
int main() {
int original = 10;
int &ref = original;
std::cout << "original值: " << original << std::endl;
std::cout << "ref值: " << ref << std::endl;
ref = 20; // 通过引用修改值
std::cout << "修改后的original值: " << original << std::endl;
std::cout << "修改后的ref值: " << ref << std::endl;
return 0;
}
输出结果:
original值: 10
ref值: 10
修改后的original值: 20
修改后的ref值: 20
引用初始化的关键性质
-
必须在声明时初始化:引用必须在创建的同时被初始化,不能像指针那样先声明后赋值。
-
不能重新绑定:一旦引用被初始化为某个变量的引用,它就不能再改变为其他变量 的引用。
-
没有空引用:不存在"空引用"的概念,引用必须引用一个已存在的变量。
警告
以下代码是错误的,因为引用在声明时没有被初始化:
int &ref; // 错误:引用必须被初始化
不同类型的引用初始化
基本数据类型的引用
对基本数据类型(如int, float, char等)的引用非常直接:
int num = 100;
int &numRef = num;
double pi = 3.14159;
double &piRef = pi;
数组的引用
数组的引用需要指定数组的大小:
int arr[5] = {1, 2, 3, 4, 5};
int (&arrRef)[5] = arr; // arrRef是对arr整个数组的引用
// 使用引用修改数组元素
arrRef[2] = 30;
std::cout << "arr[2] = " << arr[2] << std::endl; // 输出: arr[2] = 30
对象的引用
类对象同样可以使用引用:
#include <iostream>
#include <string>
class Person {
public:
std::string name;
int age;
void display() {
std::cout << "名字: " << name << ", 年龄: " << age << std::endl;
}
};
int main() {
Person student;
student.name = "张三";
student.age = 20;
Person &studentRef = student;
studentRef.age = 21; // 通过引用修改对象属性
student.display(); // 输出: 名字: 张三, 年龄: 21
return 0;
}
const引用
使用const
关键字可以创建只读的引用,这种引用不能用于修改被引用的对象:
int value = 100;
const int &constRef = value;
// constRef = 200; // 错误:不能通过const引用修改值
value = 200; // 正确:可以直接修改原变量
const引用有一个特殊性质:它可以绑定到右值(如字面常量)或不同类型的表达式上:
const int &ref1 = 42; // 绑定到字面常量
const int &ref2 = value * 2; // 绑定到表达式
double d = 3.14;
const int &ref3 = d; // 可以绑定到不同类型(发生隐式转换)
备注
对于非const引用,上述绑定方式都是不允许的。
引用与指针的区别
引用初始化与指针有显著区别:
- 引用必须在创建时初始化,指针可以稍后赋值。
- 引用初始化后不能改变引用对象,指针可以改变指向。
- 没有空引用,但有空指针(nullptr)。
- 引用使用更直观,不需要解引用操作符(*)。
// 指针示例
int value = 10;
int *ptr; // 可以不初始化
ptr = &value; // 稍后赋值
*ptr = 20; // 需要解引用
// 引用示例
int value = 10;
int &ref = value; // 必须立即初始化
ref = 20; // 直接使用,无需解引用