引用的基本概念
引用(Reference)是C++中的一种数据类型,它为一个已经存在的变量创建一个别名。引用在C++中非常有用,因为它允许你直接操作原始变量,而不是它的副本。引用的语法使用&符号。
关键点理解:
- 是C++中的一种数据类型,
- 必须初始化:它是为一个已经存在的变量创建一个别名。并且不能改变用的对象。
- 引用的语法使用&符号。
- 允许你直接操作原始变量,而不是它的副本,也就是说操作的就是原对象。提高效率和保持对象状态一致性。
- 无需解引用:这是与指针的区别,不需要解引用操作符*。
代码示例
#include <iostream>
int main() {
int a = 10;
int& ref = a; // ref是a的引用,操作ref就是操作变量a,声明ref,并初始化。
int b = a; //b只是普通的int数据类型,b是a的一个副本,有不同的地址。存在不同的位置,修改a,不会影响变量b
std::cout << "a: " << a << std::endl; // 输出10
std::cout << "ref: " << ref << std::endl; // 输出10
std::cout << "b: " << b << std::endl; // 输出10
ref = 20; // 修改ref实际上是修改a
std::cout << "a: " << a << std::endl; // 输出20
std::cout << "ref: " << ref << std::endl; // 输出20,因为修改a就是修改ref,而且输出ref不需要,用* 解引用
std::cout << "b: " << b << std::endl; // 输出10,因为修改a并不影响变量b
return 0;
}
与指针的区别
引用(Reference)和指针(Pointer)是C++中两种不同的概念,它们都用于间接访问对象。
-
声明和初始化
- 引用:在声明时必须初始化,并且不能改变引用的对象。且不能为null,一旦绑定,不能改变
int a = 10; int& ref = a; // 必须在声明时初始化
- 指针:可以在声明时不初始化,并且可以在任何时候指向不同的对象。
int a = 10; int* ptr = nullptr; // 可以不初始化 ptr = &a; // 可以在任何时候指向不同的对象
-
语法和使用
- 引用:使用引用时,不需要解引用操作符*。
int a = 10; int& ref = a; ref = 20; // 直接使用引用
- 指针:使用指针时,需要使用解引用操作符*。
int a = 10; int* ptr = &a; *ptr = 20; // 使用解引用操作符
-
空值
- 引用:引用不能为null,必须引用一个有效的对象。
int& ref = nullptr; // 错误,引用不能为null
- 指针:指针可以为null,表示它不指向任何对象。
int* ptr = nullptr; // 合法,指针可以为null
-
重新绑定
- 引用:一旦绑定到一个对象,就不能再绑定到另一个对象。
int a = 10; int b = 20; int& ref = a; ref = b; // 这是将b的值赋给a,而不是重新绑定ref
- 指针:可以在任何时候指向不同的对象。
int a = 10; int b = 20; int* ptr = &a; ptr = &b; // 重新指向b
-
内存地址
- 引用:引用本身没有独立的内存地址,它只是被引用对象的别名。
int a = 10; int& ref = a; std::cout << &ref << std::endl; // 输出a的地址
- 指针:指针是一个独立的变量,存储的是对象的地址。
int a = 10; int* ptr = &a; std::cout << ptr << std::endl; // 输出a的地址 std::cout << &ptr << std::endl; // 输出ptr的地址
总结
引用是C++中的一种数据类型,它为一个已经存在的变量创建一个别名。
- 引用:必须在声明时初始化,不能为null,一旦绑定不能改变,使用时不需要解引用操作符。
- 指针:可以在声明时不初始化,可以为null,可以重新指向不同的对象,使用时需要解引用操作符。