C++中`&`符号用法全解析

 更新时间:2026年05月23日 10:41:08   作者:海青橘  
在C++里,&有三种不同的含义,你代码里主要用,主要用于引用和取地址,理解&对于单例模式至关重要,避免复制对象、提升效率,本文逐行解析代码中所有&的含义、作用用和区别,帮助你完全掌握,立即查看

C++ 中&符号全解析(结合你的单例代码逐行讲透)

我直接结合你这段代码,把所有出现的 &、语法含义、作用、区别一次性讲清楚,新手也能完全看懂

先给你一个总览:

在 C++ 里,&3 种完全不同的含义,你的代码里用到了 2 种

  1. 引用(最常用,你的代码核心) → 变量/函数名前面的 &
  2. 取地址 → 极少用在单例里
  3. 按位与 → 这里完全不涉及

一、你的代码里所有&逐行解析

这里的&:引用(左值引用)

S& operator=(const S&) = delete;
// ↑这里                ↑这里

S&:返回值是引用

  • 语法:类型 & 变量名
  • 意思:返回这个对象本身,而不是复制一份
  • 作用:避免拷贝、提高效率、保证操作的是同一个单例对象

const S&:参数是引用

  • 意思:传参时不复制对象,直接用原来的对象
  • const:保证函数内部不能修改这个对象
  • 作用:高效、安全、不产生临时对象

这里的&:引用

static S& gets() { return s1; }
//      ↑这里
  • 意思:返回单例对象的引用
  • 不是返回对象副本!返回的就是唯一的那个 s1 本身
  • 这是单例模式必须用引用的原因:永远只有一个对象

这里的&:定义引用变量

S& s = S::gets();
// ↑这里
  • 语法:类型 & 引用名 = 实体对象;
  • 意思:s 是一个别名,它和 s1同一个东西
  • 不是新对象!不占额外内存!只是别名!

二、最重要:引用到底是什么?(用最简单的话)

引用 = 变量的别名

就像一个人有大名和小名,都是指同一个人

int a = 10;
int& b = a;
  • ab同一个变量
  • 修改 b 就是修改 a
  • 不占新内存
  • 必须初始化(不能为空)
  • 一旦绑定,不能改绑别的变量

三、语法格式(背会这 4 种就够了)

1. 定义引用变量

类型 & 引用名 = 变量名;
int &b = a;
S &s = 对象;

2. 函数返回引用

类型 & 函数名() { ... }
S & gets() { ... }

作用:返回对象本身,不复制

3. 函数参数使用引用

void func(const 类型 & 参数名)
void func(const S & obj)

作用:高效传参,不复制对象。

4. 赋值运算符重载(规范写法)

类型 & operator=(const 类型 &)
S & operator=(const S &)

四、你的单例代码里为什么到处都要用&?

我告诉你核心原因,这是单例模式的灵魂:

单例 = 只能有一个对象

如果不用引用,就会复制出新对象,单例直接失效!

看对比:

错误写法(不用引用 → 复制对象 → 不是单例)

static S gets() { return s1; }
S s = S::gets();

这里会拷贝构造一个新对象,破坏单例!

正确写法(用引用 → 同一个对象 → 单例)

static S& gets() { return s1; }
S& s = S::gets();

S& 保证永远操作唯一的那个单例对象

五、最容易混淆的点:引用 & vs 指针 *

你只需要记住一句话:

引用 = 安全的、自动解引用的指针

特性引用 S&指针 S*
空值不能为空可以为空
重新赋值不能
访问成员.->
内存不占额外内存占指针内存

你的单例用引用,就是为了安全、简洁、不复制。

六、总结(最简单版本)

你代码里所有的&都表示

引用(别名)

语法规则:

  1. S& → 返回引用(返回对象本身,不复制)
  2. const S& → 参数引用(高效传参)
  3. S& s → 定义引用变量(别名)

一句话记住:

& 放在类型后面,就是引用,代表“别名”,不复制对象,操作同一个实体。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于OpenCV实现图像分割

    基于OpenCV实现图像分割

    这篇文章主要为大家详细介绍了基于OpenCV实现图像分割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • c++实现md5加密的代码

    c++实现md5加密的代码

    这篇文章主要介绍了c++实现md5加密的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C/C++实现去除字符串中的空格(附带源码)

    C/C++实现去除字符串中的空格(附带源码)

    这篇文章主要为大家详细介绍了C/C++实现去除字符串中的空格的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-11-11
  • boost.asio框架系列之调度器io_service

    boost.asio框架系列之调度器io_service

    这篇文章介绍了boost.asio框架系列之调度器io_service,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C++超细致讲解队列queue的使用

    C++超细致讲解队列queue的使用

    队列先进先出,即只能在容器的末尾添加新元素,只能从头部移除元素,下面这篇文章主要给大家介绍了关于C++中队列queue用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Qt QMessageBox类使用教程

    Qt QMessageBox类使用教程

    QMessageBox类提供一个模态对话框,用于通知用户或询问用户一个问题并接收答案。这篇文章主要介绍了QMessageBox的一些常用用法,需要的小伙伴快来学习一下
    2021-12-12
  • C语言之malloc动态分配内存和free释放

    C语言之malloc动态分配内存和free释放

    这篇文章主要介绍了C语言之malloc动态分配内存和free释放,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C语言实现万年历

    C语言实现万年历

    这篇文章主要为大家详细介绍了C语言实现万年历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C++ Boost PropertyTree解析INI文件详解

    C++ Boost PropertyTree解析INI文件详解

    Boost PropertyTree库不仅可以解析JSON,XML格式,还可以直接解析INI格式文件。这篇文章就是为大家介绍一下如何通过Boost PropertyTree解析INI文件,需要的可以参考一下
    2022-01-01
  • 详解C++中的左值,纯右值和将亡值

    详解C++中的左值,纯右值和将亡值

    C++中本身是存在左值,右值的概念,但是在C11中又出现了左值,纯右值,将亡值得概念;这里我们主要介绍这些值的概念,感兴趣的可以了解一下
    2022-09-09

最新评论