C++ 引用变量

C++ 中引用变量是给另一个变量取一个别名。引用变量必须在创建的时候初始化,一旦与某个变量关联起来,就只能是这个变量的引用。引用是 C++ 提供的一种便捷工具,可以在无需直接使用指针的情况下高效操作变量。它在函数参数传递、返回值优化以及代码可读性方面都有重要作用。本文主要介绍C++ 中引用变量。

1、定义声明引用变量

引用变量在定义时使用 & 符号。它必须在初始化时绑定到一个已经存在的变量,且绑定后不可更改。引用变量是在C++中新的复合类型。引用变量被定义为一个变量的别名,即引用变量和其指向的变量代表同一个值,指向同一个存储单元,并且引用变量自从赋值起就已知跟着这个变量,不会再发生改变,也就是一个变量两个名字,所以更改其中的任何一个这个变量都会发生改变。

&符号可以取变量的地址,同时它的另一个含义就是用来声明引用变量:

int i;
int & r = i;

例如,

#include <iostream>
using namespace std;
int main ()
{
   // 声明正常的变量
   int    i;
   double d;
   // 声明引用变量
   int&    r = i;
   double& s = d;
   i = 3;
   cout << "正常变量i的值  : " << i << endl;
   cout << "引用变量r的值  : " << r  << endl;
   d = 12.7;
   cout << "正常变量d的值  : " << d << endl;
   cout << "引用变量s的值  : " << s  << endl;
   return 0;
}

2、引用变量和指针的区别

不存在空引用。引用必须连接到一块合法的内存。引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时间被初始化。

引用指针
必须在声明时初始化可以在声明后再赋值
一旦绑定后不能更改可以指向不同的变量
语法更简洁,
更贴近实际使用变量的方式
需要显式解引用操作(如 *ptr
不存在空引用
(必须绑定到有效对象)
可以是 nullptr
更适合用于函数参数
和返回值的场景
更适合动态内存分配
或需要修改指针地址的场景

区别示例:

#include <iostream>
using namespace std;

// 使用引用
void updateByReference(int &ref) {
    ref += 10;  // 修改引用,实际修改的是原变量
}
// 使用指针
void updateByPointer(int *ptr) {
    if (ptr) {  // 检查指针是否为 nullptr
        *ptr += 10;  // 修改指针指向的变量
    }
}

int main() {
    int a = 5;

    // 使用引用
    std::cout << "Before updateByReference: a = " 
    << a << std::endl;
    updateByReference(a);
    std::cout << "After updateByReference: a = " 
    << a << std::endl;
    // 使用指针
    int b = 5;
    std::cout << "Before updateByPointer: b = " 
    << b << std::endl;
    updateByPointer(&b);  // 传递 b 的地址
    std::cout << "After updateByPointer: b = " 
    << b << std::endl;
    // 指针可以为空
    int *nullPtr = nullptr;
    // 安全检查避免操作空指针
    updateByPointer(nullPtr);  

    return 0;
}

3、引用作为参数

C++引用作为参数传递,直接传入地址,不再开辟新的复制空间,C语言中没有引用,只有指针。

例如,

#include <iostream>
using namespace std;
int main()
{
      void swap(int & ,int&);
      int i =3,j = 5;
      swap(i,j);
     cout<<"i="<<i<<endl<<"j="<<j<<endl;
      getchar();
      return 0;
}
void swap(int &a,int &b)
{
    int temp;
    temp = a;
    a =b;
    b= temp;
}

4、引用作为返回值

引用作为函数的返回值时,必须在定义函数时在函数名前将&。用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本。

例如,

#include<iostream>
using namespace std;
int value[10];
int error=-1;
int &func(int n){
    if(n>=0&&n<=9)
        //返回的引用所绑定的变量
        //一定是全局变量,
        //不能是函数中定义的局部变量
        return value[n];
     
    else
        return error;
}
int main(){
    func(0)=10;
    func(4)=12;
    cout<<value[0]<<endl;
    cout<<value[4]<<endl;
    return 0; 
}

5、常量引用

使用 const 修饰引用,可以防止通过引用修改原变量的值。常用于函数参数,避免复制的同时保护数据。

#include <iostream>
using namespace std;

void display(const int &x) {
    // x 是常量引用,不能修改其值
    std::cout << "Value: " << x << std::endl;
}

int main() {
    int num = 100;
    display(num);  // 传递常量引用
    return 0;
}

推荐阅读
cjavapy编程之路首页