C++中`&`符號用法全解析
C++ 中&符號全解析(結(jié)合你的單例代碼逐行講透)
我直接結(jié)合你這段代碼,把所有出現(xiàn)的 &、語法含義、作用、區(qū)別一次性講清楚,新手也能完全看懂。
先給你一個總覽:
在 C++ 里,& 有 3 種完全不同的含義,你的代碼里用到了 2 種:
- 引用(最常用,你的代碼核心) → 變量/函數(shù)名前面的
& - 取地址 → 極少用在單例里
- 按位與 → 這里完全不涉及
一、你的代碼里所有&逐行解析
這里的&:引用(左值引用)
S& operator=(const S&) = delete; // ↑這里 ↑這里
S&:返回值是引用
- 語法:類型 & 變量名
- 意思:返回這個對象本身,而不是復(fù)制一份
- 作用:避免拷貝、提高效率、保證操作的是同一個單例對象
const S&:參數(shù)是引用
- 意思:傳參時不復(fù)制對象,直接用原來的對象
- 加
const:保證函數(shù)內(nèi)部不能修改這個對象 - 作用:高效、安全、不產(chǎn)生臨時對象
這里的&:引用
static S& gets() { return s1; }
// ↑這里
- 意思:返回單例對象的引用
- 不是返回對象副本!返回的就是唯一的那個 s1 本身
- 這是單例模式必須用引用的原因:永遠(yuǎn)只有一個對象
這里的&:定義引用變量
S& s = S::gets(); // ↑這里
- 語法:
類型 & 引用名 = 實體對象; - 意思:
s是一個別名,它和s1是同一個東西 - 不是新對象!不占額外內(nèi)存!只是別名!
二、最重要:引用到底是什么?(用最簡單的話)
引用 = 變量的別名
就像一個人有大名和小名,都是指同一個人。
int a = 10; int& b = a;
a和b是同一個變量- 修改
b就是修改a - 不占新內(nèi)存
- 必須初始化(不能為空)
- 一旦綁定,不能改綁別的變量
三、語法格式(背會這 4 種就夠了)
1. 定義引用變量
類型 & 引用名 = 變量名; int &b = a; S &s = 對象;
2. 函數(shù)返回引用
類型 & 函數(shù)名() { ... }
S & gets() { ... }
作用:返回對象本身,不復(fù)制。
3. 函數(shù)參數(shù)使用引用
void func(const 類型 & 參數(shù)名) void func(const S & obj)
作用:高效傳參,不復(fù)制對象。
4. 賦值運算符重載(規(guī)范寫法)
類型 & operator=(const 類型 &) S & operator=(const S &)
四、你的單例代碼里為什么到處都要用&?
我告訴你核心原因,這是單例模式的靈魂:
單例 = 只能有一個對象
如果不用引用,就會復(fù)制出新對象,單例直接失效!
看對比:
錯誤寫法(不用引用 → 復(fù)制對象 → 不是單例)
static S gets() { return s1; }
S s = S::gets();
這里會拷貝構(gòu)造一個新對象,破壞單例!
正確寫法(用引用 → 同一個對象 → 單例)
static S& gets() { return s1; }
S& s = S::gets();
S& 保證永遠(yuǎn)操作唯一的那個單例對象。
五、最容易混淆的點:引用 & vs 指針 *
你只需要記住一句話:
引用 = 安全的、自動解引用的指針
| 特性 | 引用 S& | 指針 S* |
|---|---|---|
| 空值 | 不能為空 | 可以為空 |
| 重新賦值 | 不能 | 能 |
| 訪問成員 | . | -> |
| 內(nèi)存 | 不占額外內(nèi)存 | 占指針內(nèi)存 |
你的單例用引用,就是為了安全、簡潔、不復(fù)制。
六、總結(jié)(最簡單版本)
你代碼里所有的&都表示
引用(別名)
語法規(guī)則:
S&→ 返回引用(返回對象本身,不復(fù)制)const S&→ 參數(shù)引用(高效傳參)S& s→ 定義引用變量(別名)
一句話記住:
& 放在類型后面,就是引用,代表“別名”,不復(fù)制對象,操作同一個實體。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
boost.asio框架系列之調(diào)度器io_service
這篇文章介紹了boost.asio框架系列之調(diào)度器io_service,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
C語言之malloc動態(tài)分配內(nèi)存和free釋放
這篇文章主要介紹了C語言之malloc動態(tài)分配內(nèi)存和free釋放,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
C++ Boost PropertyTree解析INI文件詳解
Boost PropertyTree庫不僅可以解析JSON,XML格式,還可以直接解析INI格式文件。這篇文章就是為大家介紹一下如何通過Boost PropertyTree解析INI文件,需要的可以參考一下2022-01-01

