国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載

這篇具有很好參考價值的文章主要介紹了C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、const成員函數(shù)

1. const成員函數(shù)是什么?

2. 為什么有const成員函數(shù)?

3. 什么時候需要使用const修飾成員函數(shù)??

二、取地址運算符重載

1. 為什么需要重載取地址運算符?

2. 默認(rèn)取地址運算符重載函數(shù)

3.?默認(rèn)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ù)中不能對類的任何成員進(jìn)行修改。

2. 為什么有const成員函數(shù)?

const成員函數(shù)的出現(xiàn)解決了兩個問題:

  1. 如何保證無法通過成員函數(shù)修改成員變量?
  2. const對象無法調(diào)用非const成員函數(shù)。
    C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載,C++,c++,開發(fā)語言

1.?const成員函數(shù)保證了無法通過成員函數(shù)修改成員變量

C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載,C++,c++,開發(fā)語言


2.?const成員函數(shù)能被const對象調(diào)用,不會產(chǎn)生權(quán)限放大問題。

C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載,C++,c++,開發(fā)語言


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進(jìn)行修飾,因為const成員函數(shù)const對象可以調(diào)用,非const對象也可以調(diào)用。


請思考下面的幾個問題:

  1. const對象可以調(diào)用非const成員函數(shù)嗎?
    答案:不可以,傳遞this指針時權(quán)限會放大
  2. 非const對象可以調(diào)用const成員函數(shù)嗎?
    答案:可以,傳遞this指針時權(quán)限縮小
  3. const成員函數(shù)內(nèi)可以調(diào)用其它的非const成員函數(shù)嗎?
    答案:不可以,傳遞this指針時權(quán)限會放大
  4. 非const成員函數(shù)內(nèi)可以調(diào)用其它的const成員函數(shù)嗎?
    答案:可以,傳遞this指針時權(quán)限縮小

二、取地址運算符重載

1. 為什么需要重載取地址運算符?

? ? ? ? 在上篇文章C++ 類和對象篇(七) 運算符重載中,分析了重載運算符的原因:為了讓自定義類型能使用運算符。重載取地址運算符的目的也是如此:讓自定義類型也能使用取地址運算符(&)。

2. 默認(rèn)取地址運算符重載函數(shù)

? ? ? ? 類中有6個默認(rèn)成員函數(shù),其中就有默認(rèn)取地址運算符重載函數(shù),所以即使類中沒有定義取地址運算符重載函數(shù),對象依然能使用取地址運算符(&):

C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載,C++,c++,開發(fā)語言

3.?默認(rèn)const取地址運算符重載函數(shù)

????????const取地址運算符重載函數(shù)也是默認(rèn)成員函數(shù),所以即使類中沒有定義取地址運算符重載函數(shù),const對象依然能使用取地址運算符(&):

C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載,C++,c++,開發(fā)語言

4. 什么時候要顯示重載取地址運算符??

????????一般不需要寫,編譯器生成的默認(rèn)的取地址和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;
}

C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載,C++,c++,開發(fā)語言


------------------------END-------------------------

才疏學(xué)淺,謬誤難免,歡迎各位批評指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-727338.html

到了這里,關(guān)于C++ 類和對象篇(八) const成員函數(shù)和取地址運算符重載的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包