研究網(wǎng)站建設(shè)網(wǎng)絡(luò)營銷方式對比分析
目錄
一、const成員函數(shù)
1. const成員函數(shù)是什么?
2. 為什么有const成員函數(shù)?
3. 什么時候需要使用const修飾成員函數(shù)??
二、取地址運算符重載
1. 為什么需要重載取地址運算符?
2. 默認取地址運算符重載函數(shù)
3.?默認const取地址運算符重載函數(shù)
4. 什么時候要顯示重載取地址運算符??
一、const成員函數(shù)
1. const成員函數(shù)是什么?
const修飾的成員函數(shù)稱為const成員函數(shù),這個const是用來修飾隱藏的this指針的。
class B{ public:int func()const{} }; 將 const修飾的“成員函數(shù)”稱之為 const成員函數(shù),const修飾類成員函數(shù), 實際修飾該成員函數(shù)隱含的 this指針,表明在該成員函數(shù)中不能對類的任何成員進行修改。
2. 為什么有const成員函數(shù)?
const成員函數(shù)的出現(xiàn)解決了兩個問題:
- 如何保證無法通過成員函數(shù)修改成員變量?
- const對象無法調(diào)用非const成員函數(shù)。
1.?const成員函數(shù)保證了無法通過成員函數(shù)修改成員變量
2.?const成員函數(shù)能被const對象調(diào)用,不會產(chǎn)生權(quán)限放大問題。
3. 為什么const對象無法調(diào)用非const成員函數(shù)??
????????每個成員函數(shù)第一個參數(shù)都是隱藏的this指針,對象在調(diào)用成員函數(shù)時會將對象的地址傳給這個this指針,但將const對象傳給this指針就會造成權(quán)限放大問題。
????????this 指針本身是?類名* const?類型的,比如Date類的this指針類型是 Date* const,這里的const在*后面,不同于const Date對象取地址后的類型:const Date* 【在*之前修飾,代表該指針指向?qū)ο蟮膬?nèi)容不能被修改(地址里的內(nèi)容不能改);在*之后修飾,代表該指針指向的對象不能被修改(指向的地址不能改)】,而且const 對象只有讀權(quán)限,而this指針*前沒const修飾有讀寫權(quán)限,所以對象在調(diào)用成員函數(shù)將對象的地址傳給這個this指針時,會造成權(quán)限放大問題。
3. 什么時候需要使用const修飾成員函數(shù)??
????????需要修改類中成員變量的成員函數(shù)(如專門用來修改成員變量的修改器),就不需要用const修飾。如果一個函數(shù)中不需要修改成員變量,建議加const進行修飾,因為const成員函數(shù)const對象可以調(diào)用,非const對象也可以調(diào)用。
請思考下面的幾個問題:
- const對象可以調(diào)用非const成員函數(shù)嗎?
答案:不可以,傳遞this指針時權(quán)限會放大- 非const對象可以調(diào)用const成員函數(shù)嗎?
答案:可以,傳遞this指針時權(quán)限縮小- const成員函數(shù)內(nèi)可以調(diào)用其它的非const成員函數(shù)嗎?
答案:不可以,傳遞this指針時權(quán)限會放大- 非const成員函數(shù)內(nèi)可以調(diào)用其它的const成員函數(shù)嗎?
答案:可以,傳遞this指針時權(quán)限縮小
二、取地址運算符重載
1. 為什么需要重載取地址運算符?
? ? ? ? 在上篇文章C++ 類和對象篇(七) 運算符重載中,分析了重載運算符的原因:為了讓自定義類型能使用運算符。重載取地址運算符的目的也是如此:讓自定義類型也能使用取地址運算符(&)。
2. 默認取地址運算符重載函數(shù)
? ? ? ? 類中有6個默認成員函數(shù),其中就有默認取地址運算符重載函數(shù),所以即使類中沒有定義取地址運算符重載函數(shù),對象依然能使用取地址運算符(&):
3.?默認const取地址運算符重載函數(shù)
????????const取地址運算符重載函數(shù)也是默認成員函數(shù),所以即使類中沒有定義取地址運算符重載函數(shù),const對象依然能使用取地址運算符(&):
4. 什么時候要顯示重載取地址運算符??
????????一般不需要寫,編譯器生成的默認的取地址和const取地址運算符重載函數(shù)完全夠用。特殊情況下,比如不想讓別人獲取對象的地址,就可以自己實現(xiàn),返回nullptr:
如果不想讓別人獲取對象的地址,就可以重載取地址運算符,返回nullptr: class A { public:A* operator&(){return nullptr;}const A* operator&()const{return nullptr;} }; int main() {A a;const A b;cout << &a << endl;cout << &b << endl;return 0; }
------------------------END-------------------------
才疏學淺,謬誤難免,歡迎各位批評指正。