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

【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載

這篇具有很好參考價值的文章主要介紹了【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

前言

運(yùn)算符重載

概念

目的

寫法

調(diào)用

注意事項

詳解注意事項

運(yùn)算符重載成全局性的弊端

類中隱含的this指針

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

賦值運(yùn)算符重載格式

注意點

明晰賦值運(yùn)算符重載函數(shù)的調(diào)用

連續(xù)賦值

傳引用與傳值返回

默認(rèn)賦值運(yùn)算符重載

前置++和后置++重載


前言

先梳理一下本篇的脈絡(luò),首先會講解運(yùn)算符重載的概念,這是本篇的基本概念。其次會講解賦值運(yùn)算符的重載,這是本篇的重點,最后是++運(yùn)算符重載,只需明晰規(guī)則即可。此外,希望這篇文章能讓大家有所收獲,如有不足之處,還請指正,小編會虛心接受并改進(jìn)質(zhì)量。


運(yùn)算符重載

概念

C++引入了運(yùn)算符重載。它和函數(shù)重載的概念類似,可以讓一個符號有不同的功能而具體的功能是由自己實現(xiàn)的。

目的

是為了增強(qiáng)代碼的可讀性。C++中有這個概念?!? + ” 這個符號可以實現(xiàn)兩個整形或浮點型相加,因為這兩個類型是語言自己定義的。但它能實現(xiàn)兩個的相加嗎?顯然不行,因為這個類型是自己設(shè)計的,相加要實現(xiàn)怎樣的效果只有自己知道。

寫法

運(yùn)算符重載也是函數(shù)的一種,只不過函數(shù)名比較特殊,其返回值和參數(shù)列表和普通函數(shù)一樣。參數(shù)的數(shù)量和操作數(shù)的數(shù)量一致,參數(shù)的順序和操作數(shù)的順序一致

函數(shù)名字為:關(guān)鍵字 operator 后面接需要重載的運(yùn)算符符號。
函數(shù)原型: 返回值類型?operator操作符(參數(shù)列表)
示例(判斷兩個日期類是否相等) 【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

調(diào)用

分為顯式調(diào)用(加關(guān)鍵字)和隱式調(diào)用(不加關(guān)鍵字),如下代碼

operator==(d1, d2)//顯式調(diào)用
==(d1, d2) //隱式調(diào)用

注意事項

運(yùn)算符重載的注意事項
1.
不能通過連接其他符號來創(chuàng)建新的操作符:比如operator@
2.
重載操作符必須有一個類類型參數(shù)
3.
用于內(nèi)置類型的運(yùn)算符,其含義不能改變,例如:內(nèi)置的整型+,不能改變其含義
4.
作為類成員函數(shù)重載時,其形參看起來比操作數(shù)數(shù)目少1,因為成員函數(shù)的第一個參數(shù)為隱藏的this
5.
.*? ?::? ?sizeof? ??:? ?. 注意以上5個運(yùn)算符不能重載。

詳解注意事項

1.想要重載一個符號,必須復(fù)用語言定義過的符號,不能憑空捏造。如下代碼就會報錯。


bool operator@(const Date& d1, const Date& d2)

【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

2.假如要把“? +? ”這個符號重載成整形和字符型的相加,這毫無意義并且會破壞語言原有的運(yùn)算規(guī)則,此時編譯器會強(qiáng)制報錯。【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

3.如果要把加“? +? ”這個符號重載兩個相加,那具體實現(xiàn)的邏輯就必須是加的邏輯,但這一點沒有強(qiáng)制性,因為這不是語法的錯誤,編譯器不會強(qiáng)行報錯。需要自行規(guī)范。

4.這一點會在下面提到。

5.?.*? ?::? ?sizeof? ??:? ?.? 這五個運(yùn)算符強(qiáng)制不能重載,大家可能對于?.*?運(yùn)算符比較陌生,?.*?運(yùn)算符并不是本篇章的重點,但為了大家能夠記住這個運(yùn)算符,小編寫了一段代碼并且配上了詳細(xì)的注釋讓大家感受一下?.*?運(yùn)算符的作用。提醒:對?.*?運(yùn)算符不感興趣的可以跳過,不會對后面內(nèi)容的理解有任何影響

class Date //日期類
{
public:
	Date(int year = 1, int month = 1, int day = 1) //構(gòu)造函數(shù)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void DatePrintf() //打印函數(shù)
	{
		cout << _year << _month << _day << endl;
	}

private:

	int _year; //年
	int _month; //月
	int _day; //日

};

typedef void(Date::* DP)();  //這里是給一個函數(shù)類型取了一個別名,別名是 DP ,類型是 void ()  日期類中的打印函數(shù)也是這個類型

int main()
{
	DP dp = &Date::DatePrintf; //把成員函數(shù)中打印函數(shù)的指針給  dp , 一般來說函數(shù)名就代表該函數(shù)的地址,但成員函數(shù)規(guī)定要加上取地址符號

	Date d; //實例化一個類 , 對象名為d

	(d .* dp)();  //調(diào)用d對象的打印函數(shù)

	return 0;
}

上述代碼中提到了構(gòu)造函數(shù),小編專門寫了一篇構(gòu)造函數(shù)的文章???對構(gòu)造函數(shù)不是很理解的可以看一下,上述代碼運(yùn)行的結(jié)果是打印三個一,如下圖:【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

運(yùn)算符重載成全局性的弊端

的數(shù)據(jù)一般是私有的,運(yùn)算符重載是函數(shù)的一種,而全局性的函數(shù)是不可以訪問類的私有數(shù)據(jù)的。如下圖:【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

難道我們要為了運(yùn)算符重載要把中的數(shù)據(jù)設(shè)為共有嗎,那的封裝性如何保證呢?本篇給出的解決方案是把運(yùn)算符重載函數(shù)定義為成員函數(shù),意思是直接定義在類中。如下代碼

class Date //日期類
{
public:
	Date(int year = 1, int month = 1, int day = 1) //構(gòu)造函數(shù)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	bool operator==(const Date& d2)  //運(yùn)算符重載函數(shù),一個參數(shù)是this ,一個是 const Date&
	{
		return _year == d2._year

			&& _month == d2._month 

			&& _day == d2._day;
	}
private:

	int _year; //年
	int _month; //月
	int _day; //日

};

中隱含的this指針

如果把運(yùn)算符重載函數(shù)定義成員函數(shù)會少定義一個參數(shù),但并沒有真的少了一個參數(shù),有一個隱含的this指針作為了該函數(shù)的第一個參數(shù)。如下圖:

【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

this是類型的隱含參數(shù),如果運(yùn)算符重載函數(shù)定義再了里面,這個參數(shù)就可以省去不寫。



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

下面的內(nèi)容涉及到拷貝構(gòu)造函數(shù),對拷貝構(gòu)造函數(shù)的理解比較模糊的可以參考一下小編寫的詳解拷貝構(gòu)造一文? ?? 。

賦值運(yùn)算符重載格式

參數(shù)類型:類類型的引用

返回值:可傳值返回,可傳引用返回,傳引用返回比傳值返回效率要高,后面會細(xì)講。

代碼示例

Date& operator=(const Date& d) //日期類的賦值運(yùn)算符的重載的定義
 {
 ? ? ? ? ? ?_year = d._year;
 ? ? ? ? ? ?_month = d._month;
 ? ? ? ? ? ?_day = d._day;
 ? ? ? }


在這里先定義一個日期類,下面討論的知識點都會用到這個日期類,大家先看一下代碼

class Date  //日期類
{
public:
	Date(int year = 1, int month = 1, int day = 1)  //全缺省構(gòu)造函數(shù)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	Date(const Date& d)  //拷貝構(gòu)造函數(shù)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	void operator=(const Date& d)  //賦值運(yùn)算符重載
	{
			_year = d._year;
			_month = d._month;
			_day = d._day;

	}
private:
		int _year;
	int _month;
	int _day;
};

注意點

賦值運(yùn)算符能再類中重載。因為賦值運(yùn)算符重載函數(shù)是類的默認(rèn)成員函數(shù),如果重載成全局函數(shù),編譯器會為類自動生成默認(rèn)賦值運(yùn)算符重載函數(shù),此時就會和全局的沖突。

明晰賦值運(yùn)算符重載函數(shù)的調(diào)用

大家能分清下面的調(diào)用嗎

int main()
{
	Date d; //實例化d

	Date d1(d);  //示例化d1,并把d的值拷貝給d1

	Date d2 = d;  //示例化d2,并把d的值拷貝給d2

	Date d3;  //實例化d3

	d3 = d;  //把d的值賦值給d3


}

畫圖演示其調(diào)用

【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

連續(xù)賦值

上述代碼中的賦值重載函數(shù)隨是否能實現(xiàn)連續(xù)賦值呢?答案是不能。因為該函數(shù)只能完成賦值工作,并不會再把類的數(shù)據(jù)返回。代碼改進(jìn)

Date operator=(const Date& d)  //賦值運(yùn)算符重載
{

		_year = d._year;
		_month = d._month;
		_day = d._day;
	
	return *this;  //返回被賦值的形參的數(shù)據(jù)
}

傳引用與傳值返回

上述代碼中傳的是的值,由于中封裝了許多數(shù)據(jù),想要把的數(shù)據(jù)傳回去,需要調(diào)用該的拷貝構(gòu)造函數(shù),我們可以打印一下拷貝構(gòu)造函數(shù)來觀察一下,如下圖【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

調(diào)用拷貝構(gòu)造函數(shù)拷貝數(shù)據(jù)的消耗是很大的,如果傳引用返回能不能減少拷貝呢,如下圖【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

結(jié)果很明確,傳引用返回并沒有調(diào)用拷貝構(gòu)造函數(shù),這說明傳引用返回比傳值返回效率更高,只要該類出了作用域不會銷毀,都可以傳引用返回

如果我要自己給自己賦值會怎么樣呢,這是沒必要的,可以再改進(jìn)一下代碼

Date& operator=(const Date& d)  //賦值運(yùn)算符重載
{
	if (this != &d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	return *this;
}

默認(rèn)賦值運(yùn)算符重載

用戶沒有顯式實現(xiàn)時,編譯器會生成一個默認(rèn)賦值運(yùn)算符重載,以值的方式逐字節(jié)拷貝。內(nèi)置類型成員變量是直接賦值的,而自定義類型成員變量需要 調(diào)用對應(yīng)類的賦值運(yùn)算符重載完成賦值。
我將用如下代碼為大家講解默認(rèn)運(yùn)算符重載函數(shù)的淺拷貝的弊端
class Date //日期類
{
public:

	Date() //構(gòu)造函數(shù)
	{
		_year = 1;
		_month = 1;
		_day = 1;

		_a = (int*)malloc(sizeof(int) * 7); //為a開辟空間
		for (int i = 0; i < 7; i++)
		{
			_a[i] = 0;
		}
	}


private:
	int _year; //年
	int _month; //月
	int _day;  //日
	int* _a;  //指向一塊空間
};
int main()
{
	Date d; //實例化對象d
	Date d1; //實例化對象d1

	d = d1; //把對象d1的數(shù)據(jù)賦值給對象d
}

下面是代碼調(diào)試示意圖【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言

下面是邏輯示意圖 【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載,C++,前端,javascript,c++,開發(fā)語言,c語言
對象d的_a不再指向原有空間,使原有空間丟失,造成內(nèi)存泄漏。 如果類中未涉及到資源管理,賦值運(yùn)算符是否實現(xiàn)都可以;一旦涉及到資源管理則必 須要實現(xiàn)


前置++和后置++重載

Date& operator++() //日期的前置++
{
	_day += 1;
	return *this;
}

	Date operator++(int) //日期類的后置++
{
	Date temp(*this);
	_day += 1;
	return temp;
}
?C++規(guī)定:? 前置++和后置++都是一元運(yùn)算符,為了讓前置++與后置++形成能正確重載,后置++重載時多增加一個int類型的參數(shù),但調(diào)用函數(shù)時該參數(shù)不用傳遞,編譯器
自動傳遞。


想為大家推薦?aMereNobody?大佬寫的文章? ??

本篇的內(nèi)容到此結(jié)束啦文章來源地址http://www.zghlxwxcb.cn/news/detail-857240.html

到了這里,關(guān)于【C++】詳解運(yùn)算符重載,賦值運(yùn)算符重載,++運(yùn)算符重載的文章就介紹完了。如果您還想了解更多內(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ù)器費(fèi)用

相關(guān)文章

  • 【C++】:拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載

    【C++】:拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載

    拷貝構(gòu)造函數(shù)是特殊的構(gòu)造函數(shù)。 是用一個已經(jīng)存在的對象,賦值拷貝給另一個新創(chuàng)建的已經(jīng)存在的對象 。 本質(zhì):用同類型的對象拷貝初始化 。 拷貝構(gòu)造函數(shù)也是 特殊的成員函數(shù) ,其特征如下: 2.1 拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個重載形式。 2.2 拷貝構(gòu)造函數(shù)的 函數(shù)名域

    2024年04月28日
    瀏覽(29)
  • C++修煉之筑基期第四層 ——透過日期類看運(yùn)算符重載 | 賦值運(yùn)算符重載 | 取地址操作符重載

    C++修煉之筑基期第四層 ——透過日期類看運(yùn)算符重載 | 賦值運(yùn)算符重載 | 取地址操作符重載

    ??作者簡介: 花想云 ,在讀本科生一枚,致力于 C/C++、Linux 學(xué)習(xí)。 ?? 本文收錄于 C++系列 ,本專欄主要內(nèi)容為 C++ 初階、C++ 進(jìn)階、STL 詳解等,專為大學(xué)生打造全套 C++ 學(xué)習(xí)教程,持續(xù)更新! ?? 相關(guān)專欄推薦: C語言初階系列 、 C語言進(jìn)階系列 、 數(shù)據(jù)結(jié)構(gòu)與算法 本章主要

    2023年04月09日
    瀏覽(21)
  • 【C++】類和對象(中)---拷貝構(gòu)造函數(shù)、賦值運(yùn)算符重載

    【C++】類和對象(中)---拷貝構(gòu)造函數(shù)、賦值運(yùn)算符重載

    個人主頁:平行線也會相交?? 歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 平行線也會相交 原創(chuàng) 收錄于專欄【C++之路】?? 本專欄旨在記錄C++的學(xué)習(xí)路線,望對大家有所幫助??? 希望我們一起努力、成長,共同進(jìn)步。?? 拷貝構(gòu)造函數(shù),又稱復(fù)制構(gòu)造函數(shù),是一種特殊的

    2024年02月05日
    瀏覽(25)
  • C++ -3- 類和對象 (中) | 拷貝構(gòu)造函數(shù) & 賦值運(yùn)算符重載

    C++ -3- 類和對象 (中) | 拷貝構(gòu)造函數(shù) & 賦值運(yùn)算符重載

    示例: 拷貝初始化構(gòu)造函數(shù)的作用是將一個已知對象的數(shù)據(jù)成員值拷貝給正在創(chuàng)建的另一個同類的對象 無窮遞歸 ? Date(Date d){……} 首先,分析 傳值傳參的過程 傳引用傳參 : 沒有拷貝 的過程,直接傳 傳值傳參: 內(nèi)置類型 編譯器可以直接拷貝(淺拷貝/值拷貝——一個字節(jié)

    2023年04月19日
    瀏覽(27)
  • 【C++】:類和對象(中)之拷貝構(gòu)造函數(shù)+賦值運(yùn)算符重載

    【C++】:類和對象(中)之拷貝構(gòu)造函數(shù)+賦值運(yùn)算符重載

    在現(xiàn)實生活中,可能存在一個與你一樣的自己,我們稱其為雙胞胎 那在創(chuàng)建對象時,可否創(chuàng)建一個與已存在對象一某一樣的新對象呢? 拷貝構(gòu)造函數(shù):只有單個形參,該形參是對本類類型對象的引用(一般常用const修飾),在用已存在的類類型對象創(chuàng)建新對象時由編譯器自動調(diào)

    2024年02月06日
    瀏覽(26)
  • c++類與對象(二)——賦值運(yùn)算符重載與取地址操作符重載

    c++類與對象(二)——賦值運(yùn)算符重載與取地址操作符重載

    前言: 本章將通過 日期類 的實現(xiàn),深入學(xué)習(xí) 運(yùn)算符重載 的實現(xiàn)方法。本章將完成6個默認(rèn)成員函數(shù)中剩余3個—— 賦值運(yùn)算符重載 與 取地址操作符重載 的學(xué)習(xí)。 C++ 為了增強(qiáng)代碼的可讀性引入了 運(yùn)算符重載 ,運(yùn)算符重載是具有 特殊函數(shù)名 的函數(shù),也具有其返回值類型,

    2024年02月03日
    瀏覽(20)
  • 【C++】C++入門—初識構(gòu)造函數(shù) , 析構(gòu)函數(shù),拷貝構(gòu)造函數(shù),賦值運(yùn)算符重載

    【C++】C++入門—初識構(gòu)造函數(shù) , 析構(gòu)函數(shù),拷貝構(gòu)造函數(shù),賦值運(yùn)算符重載

    如果一個類中什么成員都沒有,簡稱為空類。 空類中真的什么都沒有嗎? 并不是 任何類在什么都不寫時,編譯器會自動生成以下6個默認(rèn)成員函數(shù)。 默認(rèn)成員函數(shù):用戶沒有顯式實現(xiàn),編譯器會生成的成員函數(shù)稱為默認(rèn)成員函數(shù) 我們實現(xiàn)了,編譯器就不會生成了 構(gòu)造函數(shù)是

    2024年02月21日
    瀏覽(28)
  • C++從入門到精通——類的6個默認(rèn)成員函數(shù)之賦值運(yùn)算符重載

    C++從入門到精通——類的6個默認(rèn)成員函數(shù)之賦值運(yùn)算符重載

    類的6個默認(rèn)成員函數(shù):如果一個類中什么成員都沒有,簡稱為空類。 空類中真的什么都沒有嗎?并不是,任何類在什么都不寫時,編譯器會自動生成以下6個默認(rèn)成員函數(shù)。 默認(rèn)成員函數(shù):用戶沒有顯式實現(xiàn),編譯器會生成的成員函數(shù)稱為默認(rèn)成員函數(shù)。 C++為了增強(qiáng)代碼的

    2024年04月25日
    瀏覽(30)
  • 探索C++賦值運(yùn)算符重載的內(nèi)部機(jī)制:手把手教你精通

    探索C++賦值運(yùn)算符重載的內(nèi)部機(jī)制:手把手教你精通

    W...Y的主頁 ?? 代碼倉庫分享??? ??前言: 前一篇博客中我們已經(jīng)了解并學(xué)習(xí)了初始化和清理模塊中的構(gòu)造函數(shù)與析構(gòu)函數(shù),還有拷貝復(fù)制中的拷貝復(fù)制函數(shù),它們都是類與對象中重要的成員,今天我們要來講一下拷貝復(fù)制模塊中另一個非常重要的內(nèi)容——賦值重載,但是

    2024年02月08日
    瀏覽(18)
  • 【C++】類和對象③(類的默認(rèn)成員函數(shù):拷貝構(gòu)造函數(shù) | 賦值運(yùn)算符重載)

    【C++】類和對象③(類的默認(rèn)成員函數(shù):拷貝構(gòu)造函數(shù) | 賦值運(yùn)算符重載)

    ?? 個人主頁: Forcible Bug Maker ?? 專欄: C++ 目錄 前言 拷貝構(gòu)造函數(shù) 概念 拷貝構(gòu)造函數(shù)的特性及用法 賦值運(yùn)算符重載 運(yùn)算符重載 賦值運(yùn)算符重載 結(jié)語 本篇主要內(nèi)容:類的6個默認(rèn)成員函數(shù)中的 拷貝構(gòu)造函數(shù) 和 賦值運(yùn)算符重載 在上篇文章中我們講到了類的默認(rèn)成員函數(shù)的

    2024年04月17日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包