做外貿(mào)通常用哪些網(wǎng)站如何注冊(cè)自己的網(wǎng)站
個(gè)人主頁(yè) : zxctscl
如有轉(zhuǎn)載請(qǐng)先通知
文章目錄
- 1. 前言
- 2. const成員
- 3. 取地址及const取地址操作符重載
1. 前言
在之前已經(jīng)已經(jīng)分享過(guò)了關(guān)于 【C++】類和對(duì)象之常引用與運(yùn)算符重載,這次分享的有關(guān)const的內(nèi)容,話不多說(shuō),正文開(kāi)始。
2. const成員
將const修飾的“成員函數(shù)”稱之為const成員函數(shù),const修飾類成員函數(shù),實(shí)際修飾該成員函數(shù)隱含的this指針,表明在該成員函數(shù)中不能對(duì)類的任何成員進(jìn)行修改。
看看下面的代碼
class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year; int _month; int _day;
};
int main()
{const Date d1(2024, 1, 1);d1.Print();return 0;
}
在這里為什么不能調(diào)用printf
呢?
為了解決這個(gè)問(wèn)題在函數(shù)后面加const
這個(gè)是權(quán)限的平移。
#include <iostream>
using namespace std;class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print()const{cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{const Date d1(2024, 1, 31);d1.Print();Date d2(2024, 3, 31);d2.Print();return 0;
}
如果是像d2呢?
也可以用printf,這里是權(quán)限的縮小。
并不是所有的函數(shù)都能加上const。
總之:
成員函數(shù),如果是一個(gè)對(duì)成員變量只進(jìn)行讀訪問(wèn)的函數(shù),建議加const,這樣const對(duì)象和非const對(duì)象都能使用。
成員函數(shù),如果是一個(gè)對(duì)成員變量進(jìn)行讀寫(xiě)訪問(wèn)的函數(shù),不加const,否則不能修改成員變量。
下面代碼是權(quán)限放大嗎?
不是,這里是拷貝,j的改變不影響i,也不存在所謂的權(quán)限方法。
這個(gè)才是權(quán)限的放大,r的改變影響i。
p2的改變會(huì)影響p1,也就是i。
權(quán)限的放大:指針和引用賦值才存在權(quán)限放大。
來(lái)看看下面的幾個(gè)問(wèn)題:
-
const對(duì)象可以調(diào)用非const成員函數(shù)嗎?
不行,權(quán)限放大了 -
非const對(duì)象可以調(diào)用const成員函數(shù)嗎?
可以,這里權(quán)限縮小 -
const成員函數(shù)內(nèi)可以調(diào)用其它的非const成員函數(shù)嗎?
不行,權(quán)限放大了 -
非const成員函數(shù)內(nèi)可以調(diào)用其它的const成員函數(shù)嗎?
可以,這里是權(quán)限的縮小
3. 取地址及const取地址操作符重載
如果&不是默認(rèn)成員函數(shù),那么重載才能使用。
如果每次使用都要重載,那么編譯器就直接默認(rèn)生成。
這兩個(gè)默認(rèn)成員函數(shù)一般不用重新定義 ,編譯器默認(rèn)會(huì)生成,不需要自己寫(xiě),日常已經(jīng)夠用了。
class Date
{
public:Date* operator&(){return this;}const Date* operator&()const{return this;}
private:int _year; // 年int _month; // 月int _day; // 日
};
這兩個(gè)運(yùn)算符一般不需要重載,使用編譯器生成的默認(rèn)取地址的重載即可。
只有特殊情況,才需要重載,比如想讓別人獲取到指定的內(nèi)容!
像這樣普通對(duì)象能拿地址,const對(duì)象不能拿地址。
有問(wèn)題請(qǐng)指出,大家一起進(jìn)步!!!