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 → 定义引用变量(别名)

一句话记住:

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

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

相关文章

  • C语言五子棋小游戏实现代码

    C语言五子棋小游戏实现代码

    这篇文章主要为大家详细介绍了C语言五子棋小游戏实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++中拷贝构造函数的使用

    C++中拷贝构造函数的使用

    大家好,本篇文章主要讲的是C++中拷贝构造函数的使用,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 利用Matlab复刻举牌加油小人生成器

    利用Matlab复刻举牌加油小人生成器

    upuptoyou是一款非常有创意的小工具,可以在线生成举牌小人,看起来很可爱,也比较有趣,并能用于表白,或节日送祝福等场景。本文将用Matlab复刻这一小工具,需要的可以参考一下
    2022-03-03
  • C++控制台强化如何实现一定界面效果(简洁版)

    C++控制台强化如何实现一定界面效果(简洁版)

    这篇文章主要介绍了C++控制台强化如何实现一定界面效果(简洁版),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • cmake 学习笔记

    cmake 学习笔记

    这篇文章主要介绍了作者学习cmake 的相关资料与心得,有需要的小伙伴可以参考下
    2017-07-07
  • C语言中printf的两种输出对齐方式

    C语言中printf的两种输出对齐方式

    C语言中左对齐是C语言的默认输出方式,右对齐是一种特殊的输出方式,左对齐和右对齐都对应着一个已知的输出宽度,输出的字符串根据字符串的长度在宽度上进行补充,补充字符是空格,在使用printf函数输出时,需要在格式字符串中使用%-*s和%*s的格式来分别表示
    2024-02-02
  • 初识C++ Vector模板与实例化原理

    初识C++ Vector模板与实例化原理

    这篇文章主要为大家介绍了初识C++ Vector模板与实例化原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • VC++编程获取窗口句柄的方法小结

    VC++编程获取窗口句柄的方法小结

    这篇文章主要介绍了VC++编程获取窗口句柄的方法,简单总结分析了VC++获取窗口句柄的常见函数与使用技巧,需要的朋友可以参考下
    2017-07-07
  • 简单讲解C++的内部和外部函数以及宏的定义

    简单讲解C++的内部和外部函数以及宏的定义

    这篇文章主要介绍了简单讲解C++的内部和外部函数以及宏的定义,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 利用C++开发一个protobuf动态解析工具

    利用C++开发一个protobuf动态解析工具

    数据库中存储的protobuf序列化的内容,有时候查问题想直接解析查看内容。很多编码在网上很容易找到编解码工具,但protobuf没有找到编解码工具,可能这样的需求比较少吧,那就自己用C++实现一个,感兴趣的可以了解一下
    2023-01-01

最新评论