C++ 取地址符相關(guān)的默認(rèn)函數(shù)
C++編譯器會(huì)為類自動(dòng)生成兩個(gè)默認(rèn)的取地址運(yùn)算符重載函數(shù)(取普通對(duì)象地址、取const對(duì)象地址),但它們不屬于“六大默認(rèn)成員函數(shù)”,而是編譯器隱式生成的輔助函數(shù),且?guī)缀醪粫?huì)被開發(fā)者手動(dòng)修改(除非有特殊需求)。
一、取地址運(yùn)算符重載的默認(rèn)函數(shù)
1. 函數(shù)原型(以class Cgoods為例)
| 函數(shù)類型 | 原型 | 作用 |
|---|---|---|
| 普通取地址運(yùn)算符 | Cgoods* operator&() | 返回非const對(duì)象的地址(this指針) |
| const取地址運(yùn)算符 | const Cgoods* operator&() const | 返回const對(duì)象的地址(const this) |
2. 編譯器默認(rèn)實(shí)現(xiàn)
編譯器生成的默認(rèn)版本邏輯極其簡單:直接返回對(duì)象的this指針,等價(jià)于:
// 普通版本
Cgoods* Cgoods::operator&() {
return this; // 返回當(dāng)前對(duì)象的地址
}
// const版本
const Cgoods* Cgoods::operator&() const {
return this; // 返回當(dāng)前對(duì)象的const地址
}
二、使用示例(驗(yàn)證默認(rèn)行為)
在你之前的Cgoods類代碼中,無需手動(dòng)定義這兩個(gè)函數(shù),直接使用取地址符&即可:
int main() {
Cgoods goods1("蘋果", 9.9f);
const Cgoods goods2("香蕉", 5.9f);
// 調(diào)用普通取地址運(yùn)算符:operator&()
Cgoods* p1 = &goods1;
cout << "普通對(duì)象地址:" << p1 << endl;
// 調(diào)用const取地址運(yùn)算符:operator&() const
const Cgoods* p2 = &goods2;
cout << "const對(duì)象地址:" << p2 << endl;
return 0;
}
輸出結(jié)果(地址為示例,實(shí)際不同):
帶參構(gòu)造函數(shù)調(diào)用:蘋果
帶參構(gòu)造函數(shù)調(diào)用:香蕉
普通對(duì)象地址:0x7ffeefbff5e0
const對(duì)象地址:0x7ffeefbff600
析構(gòu)函數(shù)調(diào)用:釋放 香蕉 的內(nèi)存
析構(gòu)函數(shù)調(diào)用:釋放 蘋果 的內(nèi)存
三、關(guān)鍵特性說明
1. 生成條件
- 編譯器總是會(huì)生成這兩個(gè)默認(rèn)函數(shù),除非你顯式手動(dòng)定義了對(duì)應(yīng)的版本(普通/const);
- 即使你定義了其他默認(rèn)函數(shù)(如拷貝構(gòu)造、移動(dòng)賦值),這兩個(gè)取地址函數(shù)仍會(huì)被生成。
2. 何時(shí)需要手動(dòng)重載?
幾乎不需要!只有極特殊場景下才會(huì)修改,比如:
- 禁止外部獲取對(duì)象地址(返回nullptr);
- 對(duì)地址做特殊處理(如返回對(duì)象內(nèi)部某個(gè)成員的地址)。
示例:手動(dòng)重載取地址運(yùn)算符(禁止獲取地址)
class Cgoods {
// ... 其他成員不變 ...
// 手動(dòng)重載普通取地址運(yùn)算符
Cgoods* operator&() {
return nullptr; // 不返回真實(shí)地址
}
// 手動(dòng)重載const取地址運(yùn)算符
const Cgoods* operator&() const {
return nullptr;
}
};
int main() {
Cgoods goods("蘋果", 9.9f);
cout << &goods << endl; // 輸出 0(nullptr)
return 0;
}
3. 和六大默認(rèn)函數(shù)的區(qū)別
| 維度 | 六大默認(rèn)成員函數(shù)(構(gòu)造/析構(gòu)/拷貝/移動(dòng)) | 取地址運(yùn)算符重載函數(shù) |
|---|---|---|
| 核心作用 | 管理對(duì)象生命周期/資源 | 提供對(duì)象地址的訪問方式 |
| 生成優(yōu)先級(jí) | 顯式定義后編譯器不再生成 | 除非手動(dòng)定義,否則始終生成 |
| 開發(fā)修改頻率 | 高頻(如深拷貝、移動(dòng)語義) | 幾乎為0(特殊場景才修改) |
| 異常風(fēng)險(xiǎn) | 高(如內(nèi)存泄漏、重復(fù)釋放) | 極低(僅返回指針) |
總結(jié)
- 存在性:C++有取地址符相關(guān)的默認(rèn)函數(shù)(兩個(gè)版本:普通/const),但不屬于核心六大默認(rèn)成員函數(shù);
- 默認(rèn)行為:編譯器生成的版本直接返回this指針,滿足絕大多數(shù)場景需求;
- 使用建議:無需手動(dòng)重載,只有禁止獲取對(duì)象地址、修改地址返回邏輯等特殊場景才需要自定義;
- 核心記憶:取地址運(yùn)算符重載是“輔助性默認(rèn)函數(shù)”,優(yōu)先級(jí)遠(yuǎn)低于構(gòu)造/析構(gòu)/拷貝/移動(dòng),日常開發(fā)幾乎不用關(guān)注。
到此這篇關(guān)于C++ 取地址符相關(guān)的默認(rèn)函數(shù)的文章就介紹到這了,更多相關(guān)C++ 取地址符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C++中的友元函數(shù)的一些總結(jié)
以下是對(duì)C++中的友元函數(shù)進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下2013-09-09
Matlab實(shí)現(xiàn)極坐標(biāo)堆疊柱狀圖的繪制
極坐標(biāo)堆疊圖也是風(fēng)玫瑰圖的常用形式,MATLAB的bar繪制的條形圖可以繪制成堆疊形式,但是并沒有一個(gè)自帶函數(shù)可以繪制極坐標(biāo)堆疊圖。本文將為大家提供Matlab繪制極坐標(biāo)堆疊柱狀圖的示例代碼,需要的可以參考一下2022-08-08
C語言深入講解動(dòng)態(tài)內(nèi)存分配函數(shù)的使用
這篇文章主要介紹了C語言動(dòng)態(tài)內(nèi)存分配,C語言內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free、柔性數(shù)組等,下面這篇文章帶大家了解一下2022-05-05
C++ 中l(wèi)ambda表達(dá)式的編譯器實(shí)現(xiàn)原理
C++ 11加入了一個(gè)非常重要的特性——Lambda表達(dá)式。這篇文章主要介紹了C++ 中l(wèi)ambda表達(dá)式的編譯器實(shí)現(xiàn)原理,需要的朋友可以參考下2017-02-02
C語言數(shù)據(jù)結(jié)構(gòu)之簡易計(jì)算器

