C++中`&`符号用法全解析
更新时间:2026年05月23日 10:41:08 作者:海青橘
在C++里,&有三种不同的含义,你代码里主要用,主要用于引用和取地址,理解&对于单例模式至关重要,避免复制对象、提升效率,本文逐行解析代码中所有&的含义、作用用和区别,帮助你完全掌握,立即查看
C++ 中&符号全解析(结合你的单例代码逐行讲透)
我直接结合你这段代码,把所有出现的 &、语法含义、作用、区别一次性讲清楚,新手也能完全看懂。
先给你一个总览:
在 C++ 里,& 有 3 种完全不同的含义,你的代码里用到了 2 种:
- 引用(最常用,你的代码核心) → 变量/函数名前面的
& - 取地址 → 极少用在单例里
- 按位与 → 这里完全不涉及
一、你的代码里所有&逐行解析
这里的&:引用(左值引用)
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;
a和b是同一个变量- 修改
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* |
|---|---|---|
| 空值 | 不能为空 | 可以为空 |
| 重新赋值 | 不能 | 能 |
| 访问成员 | . | -> |
| 内存 | 不占额外内存 | 占指针内存 |
你的单例用引用,就是为了安全、简洁、不复制。
六、总结(最简单版本)
你代码里所有的&都表示
引用(别名)
语法规则:
S&→ 返回引用(返回对象本身,不复制)const S&→ 参数引用(高效传参)S& s→ 定义引用变量(别名)
一句话记住:
& 放在类型后面,就是引用,代表“别名”,不复制对象,操作同一个实体。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。


最新评论