自学内容网 自学内容网

[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;
}
  • 在上面的代码中,ba 的引用,它是 a 的别名。通过 b 你可以访问和修改 a 的值。
  • 引用本质上并不会创建一个新的变量,它只是原始变量的一个别名。

2. 引用的特点

  1. 引用必须初始化

    • 引用一旦被初始化,它就必须绑定到一个对象,并且不能再绑定到其他对象。引用一旦与某个对象绑定后,就无法改变引用对象。即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;
      }
      
  2. 引用不会占用额外内存

    • 引用并不占用额外的内存空间,它只是一个对象的别名。因此,引用与原对象共享同一内存。
  3. 引用无法为 nullptr

    int a = 10;
    int &b = a;  // 正确,引用必须绑定到有效对象
    
    // int &c = nullptr;  // 错误,引用不能为 null
    
    • 在 C++ 中,引用必须绑定到一个有效的对象,不能为 nullptr。如果你需要一个可以为空的引用,可以使用指针。

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. 引用的常见用法

  1. 引用作为函数参数:避免拷贝并可以修改参数。
  2. 引用作为返回值:返回对象的引用,以允许修改该对象。
  3. 常量引用:常常用于函数参数传递,避免不必要的拷贝。
示例:引用作为返回值
#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)!