[C++]引用的常见概念和常见用法
在 C++ 中,引用是一种类型别名,允许你通过别名来访问某个对象。引用提供了一种方式,可以通过 别名 来操作原始对象,而不需要复制它。引用可以看作是指针的一个简化版,它使得程序员能够更加直观地操作对象。
1. 引用的基本概念
引用的本质是给一个已经存在的变量起一个别名,也就是说它不占用新的内存空间。引用是直接绑定到一个已有的对象的,它的生命周期与对象的生命周期一致。
1.引用的语法
类型 &引用名 = 被引用的对象;
- 类型:引用的类型必须与所引用的对象类型一致。
- &:
&
表示声明一个引用。 - 引用名:引用的名称。
- 被引用的对象:引用所绑定的已有对象。
示例:
#include <iostream>
using namespace std;
int main() {
int a = 10; // 原始对象
int &b = a; // b 是 a 的引用,b 是 a 的别名
cout << "a: " << a << endl; // 输出 10
cout << "b: " << b << endl; // 输出 10
b = 20; // 通过引用 b 修改了 a 的值
cout << "a: " << a << endl; // 输出 20
cout << "b: " << b << endl; // 输出 20
return 0;
}
- 在上面的代码中,
b
是a
的引用,它是a
的别名。通过b
你可以访问和修改a
的值。 - 引用本质上并不会创建一个新的变量,它只是原始变量的一个别名。
2. 引用的特点
-
引用必须初始化:
- 引用一旦被初始化,它就必须绑定到一个对象,并且不能再绑定到其他对象。引用一旦与某个对象绑定后,就无法改变引用对象。即b一旦引用a之后它就是a的副本了,不能再改编成为别的对象的副本了
#include <iostream> using namespace std; int main() { int a = 10; // 原始对象 int &b = a; // b 是 a 的引用,b 是 a 的别名 cout << "a: " << a << endl; // 输出 10 cout << "b: " << b << endl; // 输出 10 b = 20; // 通过引用 b 修改了 a 的值 cout << "a: " << a << endl; // 输出 20 cout << "b: " << b << endl; // 输出 20 /*int c = 30; &b = c;//这个是错的,不能这么用*/ return 0; }
- 引用一旦被初始化,它就必须绑定到一个对象,并且不能再绑定到其他对象。引用一旦与某个对象绑定后,就无法改变引用对象。即b一旦引用a之后它就是a的副本了,不能再改编成为别的对象的副本了
-
引用不会占用额外内存:
- 引用并不占用额外的内存空间,它只是一个对象的别名。因此,引用与原对象共享同一内存。
-
引用无法为
nullptr
:int a = 10; int &b = a; // 正确,引用必须绑定到有效对象 // int &c = nullptr; // 错误,引用不能为 null
- 在 C++ 中,引用必须绑定到一个有效的对象,不能为
nullptr
。如果你需要一个可以为空的引用,可以使用指针。
- 在 C++ 中,引用必须绑定到一个有效的对象,不能为
3.引用作为函数参数:
- 引用常常用作函数参数,以避免拷贝传递的开销,并且可以在函数中修改传入的实参值。
void increment(int &x) { x++; // 修改原始对象 } int main() { int a = 5; increment(a);//这里的传参相当于(int &x = a) cout << "a: " << a << endl; // 输出 6 return 0; }
4. 常量引用
常量引用是对常量对象的引用,不允许通过引用修改对象的值。常量引用用常于传递参数,以防止在函数中修改实参,同时避免大对象的拷贝。
语法:
const 类型 &引用名 = 被引用的对象;
示例:
#include <iostream>
using namespace std;
void print(const int &x) {
cout << "Value: " << x << endl;
// x = 10; // 错误:不能修改常量引用的值
}
int main() {
int a = 5;
print(a); // 传递常量引用
return 0;
}
- 在上面的示例中,
print
函数接受一个 常量引用,这意味着它不能修改传入的参数x
。 - 常量引用常常用来传递 大对象(如
std::vector
等),避免拷贝开销。
5. 引用与指针的区别
虽然引用和指针都可以用来间接访问对象,但它们之间有一些关键的区别:
特性 | 引用 | 指针 |
---|---|---|
初始化 | 引用必须在声明时初始化 | 指针可以在任何时刻初始化,可以是 nullptr |
是否可以改变 | 引用一旦绑定就不能改变 | 指针可以重新指向其他对象 |
内存占用 | 不占用额外内存 | 占用额外内存(存储指向对象的地址) |
空值 | 引用不能为 nullptr | 指针可以是 nullptr |
语法 | 访问引用的对象与直接访问对象相同 | 使用 * 解引用访问对象 |
示例对比:
int a = 10;
int b = 20;
// 引用
int &ref = a; // ref 是 a 的引用
ref = b; // 修改 ref 会修改 a 的值
// 指针
int *ptr = &a; // ptr 指向 a
*ptr = b; // 修改 *ptr 会修改 a 的值
ptr = &b; // ptr 可以重新指向 b
6. 引用的常见用法
- 引用作为函数参数:避免拷贝并可以修改参数。
- 引用作为返回值:返回对象的引用,以允许修改该对象。
- 常量引用:常常用于函数参数传递,避免不必要的拷贝。
示例:引用作为返回值
#include <iostream>
using namespace std;
int& getMax(int &a, int &b) {
return (a > b) ? a : b;
}
int main() {
int x = 10, y = 20;
int &maxVal = getMax(x, y); // 返回一个引用
maxVal = 100; // 修改返回值(也就是修改 x 或 y)
cout << "x: " << x << ", y: " << y << endl; // 输出:x: 100, y: 20
return 0;
}
getMax
函数返回一个引用,允许调用者直接修改最大值。
7.总结
- 引用 是对象的别名,不占用额外的内存,它提供了一种直接访问对象的方式。
- 引用必须初始化,并且一旦绑定到某个对象后,不能再绑定到其他对象。
- 常量引用 常用于函数参数传递,避免拷贝并保证对象不被修改。
- 引用相比指针,更简洁且语法上更直观,但没有指针灵活(如不能重新指向其他对象)。
原文地址:https://blog.csdn.net/2302_80281315/article/details/144354904
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!