最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++進(jìn)一步認(rèn)識(shí)類與對(duì)象

 更新時(shí)間:2021年10月21日 15:46:24   作者:藍(lán)樂  
類是創(chuàng)建對(duì)象的模板,一個(gè)類可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都是類類型的一個(gè)變量;創(chuàng)建對(duì)象的過程也叫類的實(shí)例化。每個(gè)對(duì)象都是類的一個(gè)具體實(shí)例(Instance),擁有類的成員變量和成員函數(shù)

賦值操作符重載函數(shù)

1.運(yùn)算符重載

C++為了增強(qiáng)代碼的可讀性引入了運(yùn)算符重載,運(yùn)算符重載是具有特殊函數(shù)名的函數(shù),也具有其返回值類型,函數(shù)名字以及參數(shù)列表,其返回值類型與參數(shù)列表與普通的函數(shù)類似。

其函數(shù)名為: operator + 需要重載的運(yùn)算符符號(hào)(參數(shù)列表)。

需要注意的是:

(1)不能通過連接其他符號(hào)來創(chuàng)建新的操作符,比如operator$.也就是說,operator只能重載已有的操作符,其他的符號(hào)不能通過該函數(shù)來創(chuàng)造。

(2)重載操作符必須有一個(gè)類類型或枚舉類型的操作數(shù)。

(3)用于內(nèi)置類型的操作符,其含義不能改變。比如,內(nèi)置整型的==,不能改變其類型。

(4)運(yùn)算符重載函數(shù)的參數(shù)個(gè)數(shù)為操作符的操作數(shù)個(gè)數(shù),比如對(duì)于==操作符,其操作數(shù)由兩個(gè),那么重載該操作符的函數(shù)參數(shù)應(yīng)為2個(gè),即operator==(int x,int y);

(5)對(duì)于作為類成員的操作符重載函數(shù),其參數(shù)看起來要比操作符的操作數(shù)個(gè)數(shù)少一個(gè),這是因?yàn)楹瘮?shù)隱含了一個(gè)形參this,并且this指針被限定為第一個(gè)形參。

(6)語法規(guī)定,有五個(gè)操作符不能被重載,即.*(成員中指針解引用)、::(作用域限定符)、?:(三目操作符)、.(成員(對(duì)象)選擇)、sizeof(長(zhǎng)度運(yùn)算符)。這里需要注意的是.(解引用操作符)可以被重載,不能被重載的操作符為s1.*ptr中的.*操作符,即訪問類中指針成員并解引用。

用我們熟悉的日期類來舉例,比如我們要實(shí)現(xiàn)==這個(gè)操作符的重載函數(shù):

//頭文件Date.h中
class Date
{
public:
	//獲取某年某月的天數(shù)
	int GetDay(int year, int month)
	{
		assert(month > 0 && month < 13);
		int Day[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (month == 2 && year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//閏年二月
		{
			return 29;
		}
		return Day[month];
	}
	//全缺省的構(gòu)造函數(shù)
	Date(int year = 0, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
		//判斷初始化的日期是否合理
		if (_month >= 13 || _day > GetDay(_year, _month) || _month <= 0 || _day <= 0
			|| _year < 0)
		{
			cout << _year << "/" << _month << "/" << _day << "->";
			cout << "非法日期" << endl;
		}
	}
	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
	//拷貝構(gòu)造函數(shù),d1(d2)
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	//==運(yùn)算符重載
	bool operator==(const Date& d) const;
private:
	int _year;
	int _month;
	int _day;
};
//源文件Date.cpp中
//需要注意,左操作數(shù)為this指針指向的調(diào)用函數(shù)的對(duì)象,
//即函數(shù)等價(jià)于bool operator==(Date* this, const Date d);
bool Date::operator==(const Date& d) const
{
	return this->_year == d._year
		&& this->_month == d._month
		&& this->_day == d._day;
}

由于==操作符的結(jié)果為真或假,因此函數(shù)的返回值設(shè)為bool類型。

2.賦值運(yùn)算符重載

我們知道賦值運(yùn)算符為=,那么重載賦值運(yùn)算符的函數(shù)應(yīng)為:

//Date.cpp中
Date& Date::operator=(const Date& d)
{
	if (this != &d)//排除兩個(gè)操作數(shù)相同的情況
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	return *this;
}

需要注意的是:

(1)首先,為了減少形參拷貝導(dǎo)致的開銷,我們用引用作為形參類型;其次,由于函數(shù)并不會(huì)修改原操作數(shù),因此加上const可以保證代碼的安全性。

(2)這里的*this即this所指向的對(duì)象出了這個(gè)賦值重載函數(shù)并不會(huì)銷毀,因此可以用引用返回,返回類型為類名加引用。

(3)如果操作數(shù)為兩個(gè)相同的對(duì)象,回導(dǎo)致賦值操作多余,因此需要檢查是否出現(xiàn)自己給自己賦值的情況。

3.默認(rèn)的賦值操作符重載函數(shù)

一個(gè)類如果沒有顯式定義賦值運(yùn)算符重載,編譯器也會(huì)生成一個(gè),完成對(duì)象按字節(jié)序的淺拷貝(值拷貝)。

以上面的Date類為例,在我們不實(shí)現(xiàn)賦值操作符重載函數(shù)的情況下:

int main()
{
    Date d1(2021,10,15);
    Date d2;
    //這里d2回調(diào)用編譯器自己生成的operator=函數(shù)完成拷貝
    //即d2.operator=(d1);
    d2 = d1;
    return 0;
}

和拷貝構(gòu)造函數(shù)一樣,編譯器生成的默認(rèn)賦值重載函數(shù)已經(jīng)可以完成字節(jié)序的值拷貝了,對(duì)于Date類這樣的我們無需自己定義,但是對(duì)于Stack這樣會(huì)向內(nèi)存申請(qǐng)空間的類,不能直接調(diào)用編譯器的默認(rèn)函數(shù),會(huì)對(duì)已經(jīng)釋放的空間重復(fù)釋放。

4.賦值重載函數(shù)與拷貝構(gòu)造函數(shù)的對(duì)比

賦值重載函數(shù)與拷貝構(gòu)造函數(shù)的作用都是實(shí)現(xiàn)字節(jié)序的拷貝,那么二者之間有什么區(qū)別呢?

首先,拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個(gè)函數(shù)重載形式,其函數(shù)名為類名,無返回值,而賦值重載函數(shù)為=這個(gè)操作符的重載,其函數(shù)名為operator=,返回值為類名,需要注意的是函數(shù)重載與操作符重載二者之間沒有任何關(guān)聯(lián)。

其次,一個(gè)對(duì)象在初始化時(shí)調(diào)用的時(shí)拷貝構(gòu)造函數(shù),而對(duì)象初始化完成后再調(diào)用即為賦值重載函數(shù),比如:

int main()
{
    Date d1(2021,10,15);
    //調(diào)用拷貝構(gòu)造函數(shù),相對(duì)于Date d2(d1);
    Date d2 = d1;
    Date d3(2021,10,15);
    Date d4;
    //調(diào)用賦值重載函數(shù),即d4.operator=(d3);
    d4 = d3;
    return 0;
}

最后,由于=可以連續(xù)使用,因此賦值重載函數(shù)可以連續(xù)調(diào)用,比如:

int main()
{
    Date d1(2021,10,15);
    Date d2;
    Date d3;
    //連續(xù)調(diào)用,相當(dāng)于,d3 = (d2 = d1); 而d2 = d1有一個(gè)返回值
    //該返回值再作為操作數(shù)賦值給d3
    //也就相當(dāng)于d3.operator(d2.operator(d1));
    d3 = d2 = d1;
    return 0;
}

日期類的實(shí)現(xiàn)

學(xué)習(xí)完操作符重載,我們可以實(shí)現(xiàn)操作符==、+=、-=、>、<等等。

	//賦值運(yùn)算符重載,d2=d3 -> d2.operater=(d3)
	Date& operator=(const Date& d);//由于在類域中this所指向的對(duì)象并不會(huì)銷毀,因此可以用引用返回
	//日期+=天數(shù)
	Date& operator+=(int day);
	//日期+天數(shù)
	Date operator+(int day) const;
	//日期-=天數(shù)
	Date& operator-=(int day);
	//日期-天數(shù)
	Date operator-(int day) const;
	//前置++
	Date& operator++();
	//后置++
	Date operator++(int);
	//前置--
	Date& operator--();
	//后置--
	Date operator--(int);
	//==運(yùn)算符重載
	bool operator==(const Date& d) const;
	//!=運(yùn)算符重載
	inline bool operator!=(const Date& d) const;
	//>運(yùn)算符重載
	bool operator>(const Date& d);
	//<運(yùn)算符重載
	inline bool operator<(const Date& d);
	//>=運(yùn)算符重載
	inline bool operator>=(const Date& d);
	//<=運(yùn)算符重載
	inline bool operator<=(const Date& d);
	//日期 - 日期,返回天數(shù)
	int operator-(const Date& d) const;

const成員

我們先來看看下面這個(gè)代碼:

	//>運(yùn)算符重載
	bool operator>(const Date& d);
	void Test6()
{
	const Date d1(2021, 10, 16);
	Date d2 = d1 + 100;
	cout << (d1 > d2) << endl;
}

在這里插入圖片描述

實(shí)際運(yùn)行過程中會(huì)發(fā)現(xiàn)d1 > d2這句代碼編譯不過去,這是因?yàn)殡[含的this指針默認(rèn)的類型為不加const修飾的指針類型,而d1的類型為const修飾的變量,因此傳參給this后放大了修改的權(quán)限,導(dǎo)致出現(xiàn)錯(cuò)誤。但是this指針的類型我們是無法修改的,那么要怎么解決這種情況呢?這就需要用到我們接下來要介紹的const修飾類的成員函數(shù)了。

1.const修飾類的成員函數(shù)

將const修飾的類成員函數(shù)稱之為const成員函數(shù),const修飾類成員函數(shù),實(shí)際修飾該成員函數(shù)隱含的this指針,表明在該成員函數(shù)中不能對(duì)類的任何成員進(jìn)行修改。

比如說上述代碼我們可以修改為:

	//>運(yùn)算符重載,其相當(dāng)于bool operator>(const Date* this, const Date& d);
	bool operator>(const Date& d) const;

2.小結(jié)

1.成員函數(shù)加const,變成const成員函數(shù),這樣既可以讓const對(duì)象調(diào)用,也可以讓非const對(duì)象調(diào)用。

2.不是所有的成員函數(shù)都要加const,因?yàn)橛械暮瘮?shù)需要用this指針修改成員變量。

3.一個(gè)成員函數(shù)是否要加const應(yīng)看其功能,若為修改型,比如operator+=();Push();等不需要加const;而對(duì)于只讀型,Print();operator+();等就最好加上const。

綜上,如果要修改成員就不加const,若不修改則最好加上const。

取地址及const取地址操作符重載函數(shù)

類的最后兩個(gè)默認(rèn)成員函數(shù)為操作符&的重載及其加上const修飾的函數(shù)。

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)容!但在實(shí)際過程中應(yīng)用不多。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • FFmpeg實(shí)戰(zhàn)之利用ffplay實(shí)現(xiàn)自定義輸入流播放

    FFmpeg實(shí)戰(zhàn)之利用ffplay實(shí)現(xiàn)自定義輸入流播放

    ffplay是FFmpeg提供的一個(gè)極為簡(jiǎn)單的音視頻媒體播放器,可以用于音視頻播放、可視化分析。本文將利用ffplay實(shí)現(xiàn)自定義輸入流播放,需要的可以參考一下
    2022-12-12
  • C++ 超詳細(xì)快速掌握二叉搜索樹

    C++ 超詳細(xì)快速掌握二叉搜索樹

    從這篇博客開始,我就要和大家介紹有關(guān)二叉搜索樹的知識(shí),它還衍生出了兩棵樹——AVL樹和紅黑樹,在后面兩篇博客我都會(huì)介紹。今天先從二叉搜索樹開始引入
    2022-03-03
  • c++動(dòng)態(tài)庫(kù)調(diào)用的實(shí)現(xiàn)

    c++動(dòng)態(tài)庫(kù)調(diào)用的實(shí)現(xiàn)

    本文主要介紹了c++動(dòng)態(tài)庫(kù)調(diào)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 用C語言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲

    用C語言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++實(shí)現(xiàn)LeetCode(30.串聯(lián)所有單詞的子串)

    C++實(shí)現(xiàn)LeetCode(30.串聯(lián)所有單詞的子串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(30.串聯(lián)所有單詞的子串),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ 中字符串操作--寬窄字符轉(zhuǎn)換的實(shí)例詳解

    C++ 中字符串操作--寬窄字符轉(zhuǎn)換的實(shí)例詳解

    這篇文章主要介紹了C++ 中字符串操作--寬窄字符轉(zhuǎn)換的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)這樣的功能更,需要的朋友可以參考下
    2017-09-09
  • 詳解如何將Spire.XLS for C++集成到C++程序中

    詳解如何將Spire.XLS for C++集成到C++程序中

    Spire.XLS for C++ 是一個(gè) Excel 庫(kù),供開發(fā)人員在任何類型的 C++ 應(yīng)用程序中操作 Excel 文檔(XLS、XLSX、XLSB 和 XLSM)。 本文演示了如何以兩種不同的方式將 Spire.XLS for C++ 集成到您的 C++ 應(yīng)用程序中
    2023-03-03
  • C語言超詳細(xì)講解棧與隊(duì)列實(shí)現(xiàn)實(shí)例

    C語言超詳細(xì)講解棧與隊(duì)列實(shí)現(xiàn)實(shí)例

    棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為?"一對(duì)一"?的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解
    2022-03-03
  • C語言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)

    C語言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)

    C語言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語言.那么C語言函數(shù)設(shè)計(jì)的一般原則和技巧都是怎樣的呢,下面帶你了解
    2022-04-04
  • visual studio code 配置C++開發(fā)環(huán)境的教程詳解 (windows 開發(fā)環(huán)境)

    visual studio code 配置C++開發(fā)環(huán)境的教程詳解 (windows 開發(fā)環(huán)境)

    這篇文章主要介紹了 windows 開發(fā)環(huán)境下visual studio code 配置C++開發(fā)環(huán)境的圖文教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

兴化市| 花莲市| 鄂尔多斯市| 易门县| 屯昌县| 志丹县| 淮安市| 湟源县| 柯坪县| 镇江市| 宣城市| 郧西县| 永新县| 淄博市| 武夷山市| 正定县| 邯郸县| 洞头县| 桦甸市| 阿拉善右旗| 吉安县| 长海县| 延边| 淳化县| 红安县| 镇安县| 扶沟县| 临清市| 左云县| 宜兴市| 泽库县| 平顶山市| 永嘉县| 华亭县| 贵南县| 汉寿县| 赤城县| 雅江县| 鄂托克旗| 大足县| 抚顺市|