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

C++語法——詳解運算符重載

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

運算符重載是C++的一個重要特性。有了運算符重載,在代碼編寫時能更好的實現(xiàn)封裝。

目錄

一.運算符重載介紹

二.運算符重載形式

(一).參數(shù)

(二).返回值

(三).應用

三.特殊的運算符重載

(一).默認賦值運算符重載

(二).自增運算符A++與++A

(三).流提取>>與流插入<<

四.不能進行重載的運算符


?文章來源地址http://www.zghlxwxcb.cn/news/detail-424615.html

一.運算符重載介紹

運算符重載,就是讓原本已經(jīng)存在的運算符有了新的用法和意義。

比如我們熟知的減號(-),原本是用來進行數(shù)字的相減處理。但經(jīng)過運算符重載后,它可以用來進行其他類型的相減,像時間相減、日期相減、字符相減等等。只要是你能想到的,通過運算符重載基本都能夠?qū)崿F(xiàn)。

對于C++而言,運算符重載一般是作為類的成員函數(shù)出現(xiàn)。因為當我們需要運算符重載時,往往是類中一種特殊的類型需要處理或者類本身需要處理。就像我們可能會把時間作為一個類,里面有小時、分鐘、秒。如果讓時間相減,那么減號的參數(shù)類型就變成了時間類。因此,重載最好作為類的成員函數(shù)出現(xiàn),減少在我們調(diào)用運算符重載時發(fā)生沖突的可能。

二.運算符重載形式

[返回值] operator[運算符] (參數(shù)...) { ... };

(一).參數(shù)

第一點:

這里我們必須注意的是,重載的參數(shù)個數(shù)必須與運算符原意的個數(shù)一致。比如+號的參數(shù)就是左加數(shù)和右加數(shù)兩個。那么當我們重載加號時也要保證有左右兩個加數(shù)作為參數(shù)。

第二點:

重載作為普通函數(shù)時:

單目:右操作數(shù)是形參;雙目:左邊形參作為運算符左操作數(shù),右邊形參是右操作數(shù)。

重載作為類的成員函數(shù)時:

如果運算符參數(shù)只有一個,那么不需要寫參數(shù);如果運算符參數(shù)有兩個,那么只需要寫一個參數(shù)。

因為類的成員函數(shù)默認有一個this指針。它會直接指向類本身。換句話說,當我們寫出運算符重載時,有一個參數(shù)就已經(jīng)被this指針包含了。

單目運算符,this所指向運算符右參數(shù),因為單目運算符的參數(shù)一般都在右邊。

雙目運算符,this指向運算符左參數(shù)。

以減號為例,兩個時間類a和b相減時。如果是a - b,那么this指針指向a,反之則指向b。在聲明函數(shù)時,我們只需要寫右參數(shù)即可。a - b的話只需要寫 int operator-(Time b);

當然,單目運算符由于只有一個參數(shù),且該參數(shù)被this所指向,那么我們無需聲明任何參數(shù)即可。

(二).返回值

運算符的返回值類型取決于該重載函數(shù)的作用是什么。

比如a + b的作用是得到一個加數(shù),那么返回值就是a+b的值。a += b的作用是讓a的值改變,既然是讓參數(shù)a的值改變,那么就無需返回值。

還有就是如果我們需要運算符支持多次操作那么也需要返回值。比如流插入運算符<<。我們可能需要多次進行插入,像cout << a << b << c;之類就需要返回流ostream本身以便于之后的流插入工作。

(三).應用

下面,我來為大家展示幾種運算符重載方式:

加號(雙目):

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;
		
	}
	Time operator+(int min)//加分鐘
	{
		 Time t(*this);//因為是+號,規(guī)定不能改變左右參數(shù)的值,所以使用t來取和用以返回。
		 t._min += min;
		 if (t._min > 59)//檢查時間正確性
		 {
			 t._hour += (t._min / 60);
			 if (t._hour > 23)
				 t._hour /= 24;
			 t._min %= 60;
		 }
		 return t;
	}
};
int main()
{
	Time a(10, 30, 30);
	(a + 140).Print();
    return 0;
}

C++語法——詳解運算符重載

?自增(單目):

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;
		
	}
	int& operator++()// ++a和a++分別如何我們之后會講到,這里使用++a
	{
		return _hour += 1;//為方便演示,讓小時+1,但不再判斷時間正確性
	}
};
int main()
{
	Time a(10, 30, 30);
	++a;
	a.Print();
    return 0;
}

C++語法——詳解運算符重載

三.特殊的運算符重載

(一).默認賦值運算符重載

即便我們沒有手動定義賦值運算符重載,C++也為我們提供了默認函數(shù)。

在默認賦值重載中,內(nèi)置類型按字節(jié)拷貝,自定義類型會去調(diào)自己的默認賦值重載。這點與默認拷貝構造極為相似,不懂的可以看看這篇文章:詳解析構函數(shù)、拷貝構造函數(shù)

因此,當我們的類中只有int、char、double之類內(nèi)置類型時,無需再寫賦值重載。

但是,如果有指針、malloc、new之類指向地址、手動開辟空間的,一般情況下還是需要手寫重載的。

總而言之,默認賦值重載只能進行淺拷貝,是否需要手動去寫要根據(jù)類的成員類型判斷。

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;
		
	}
	
};
int main()
{
	Time a;
	Time b(20, 10, 50);
	a.Print();
	a = b;//調(diào)用默認賦值重載
	a.Print();
    return 0;
}

C++語法——詳解運算符重載?值得注意的一點是:

我們需要分清楚賦值重載與拷貝構造的區(qū)別。

拷貝構造只能發(fā)生在對象被定義時,而賦值則是在對象已經(jīng)被定義完畢后。

void main()
{
    Time A;
    Time T = A;//拷貝構造
    Time B;
    B = A;//賦值重載
}

(二).自增運算符A++與++A

因為單目運算符重載的this指針指向右邊,所以按正常寫法我們寫出來的是++A。

C++規(guī)定,A++的寫法是在正常++運算重載基礎上,在參數(shù)上寫一個int類型的參數(shù)。

方式如下:

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;

	}
	//為方便演示,讓小時+1,但不再判斷時間正確性
	Time& operator++()// ++A
	{
		_hour += 1;
		return (*this);//因為自增直接返回this用引用接收
	}
	Time operator++(int)//A++,參數(shù)寫int或int i都可以
	{
		Time ret(*this);
		_hour += 1;
		return ret;//需要返回this自增之前的結果,所以用臨時變量返回
	}
};
int main()
{
	Time a(10, 30, 30);
    //(++a).Print();
	//a.Print();
	(a++).Print();
	a.Print();
	return 0;
}

?C++語法——詳解運算符重載

C++語法——詳解運算符重載?

(三).流提取>>與流插入<<

對于流而言,因為是雙目運算符,this指針本應該指向左邊的類,但左操作數(shù)是一個流,又與this的類型沖突。那么就會出現(xiàn)很奇怪的現(xiàn)象:

C++語法——詳解運算符重載

因為this指針會默認指向類,而我們需要讓左參數(shù)指向流,右參數(shù)指向類。所以重載就不能作為類的成員函數(shù)出現(xiàn)了。

這時,就需要用到友元函數(shù)friend。友元函數(shù)本身是一個普通函數(shù),但是作為類的友元,能夠調(diào)用類內(nèi)的成員,包括private。而且參數(shù)不用被類限制為第一個必須是this所指的對象本身。

使用時,我們只需要在類內(nèi)聲明有個友元函數(shù)即可。

#include"head.h"
class Time
{
	friend ostream& operator<<(ostream& out, Time& t);//友元函數(shù),聲明
	friend istream& operator>>(istream& in, Time& t);
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	
};
ostream& operator<<(ostream& out, Time& t)//流插入
{
	out << t._hour << ":" << t._min << ":" << t._sec << endl;
	return out;
}
istream& operator>>(istream& in, Time& t)//流提取
{
	in >> t._hour >> t._min >> t._sec;
	return in;
}
int main()
{
	Time a;
	cin >> a;
	cout << a;
	return 0;
}

C++語法——詳解運算符重載?

四.不能進行重載的運算符

在C++中有幾種運算符不能進行重載

.* 任意字符出現(xiàn)零次或多次
:: 域作用符
sizeof 大小
? : 三目運算符
. 點運算符

?

?

  • “優(yōu)良設計創(chuàng)造價值的速度,快于其增加成本的速度。”——托馬斯·C.蓋勒(Thomas C.Gale)

?如有錯誤,敬請斧正

?

?

到了這里,關于C++語法——詳解運算符重載的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 【C++】運算符重載案例 - 字符串類 ⑤ ( 重載 大于 > 運算符 | 重載 小于 < 運算符 | 重載 右移 >> 運算符 - 使用全局函數(shù)重載 | 代碼示例 )

    使用 成員函數(shù) 實現(xiàn) 等于判斷 == 運算符重載 : 首先 , 寫出函數(shù)名 , 函數(shù)名規(guī)則為 \\\" operate \\\" 后面跟上要重載的運算符 , 要對 String a , b 對象對比操作 , 使用 大于 運算符 , 使用時用法為 a b ; 函數(shù)名是 operate ; 然后 , 根據(jù)操作數(shù) 寫出函數(shù)參數(shù) , 參數(shù)一般都是 對象的引用 ; 要對

    2024年02月07日
    瀏覽(27)
  • 【C++】中類的6個默認成員函數(shù) 取地址及const成員函數(shù) && 學習運算符重載 && 【實現(xiàn)一個日期類】

    【C++】中類的6個默認成員函數(shù) 取地址及const成員函數(shù) && 學習運算符重載 && 【實現(xiàn)一個日期類】

    1.1 運算符重載【引入】 C++為了增強代碼的可讀性引入了 運算符重載 ,運算符重載是具有特殊函數(shù)名的函數(shù),也具有其返回值類型,函數(shù)名字以及參數(shù)列表,其返回值類型與參數(shù)列表與普通的函數(shù)類似。 函數(shù)名字為: operator后面接需要重載的運算符符號。 函數(shù)原型:

    2024年02月21日
    瀏覽(34)
  • C++,運算符重載——關系運算符練習

    C++,運算符重載——關系運算符練習

    一、關系運算符重載 = = == != ?二、知識點整理 ?

    2024年02月11日
    瀏覽(25)
  • 【C++】運算符重載

    目錄 1. 基本概念 1.1 直接調(diào)用一個重載的運算符函數(shù) 1.2 某些運算符不應該被重載 1.3 使用與內(nèi)置類型一致的含義 1.4 賦值和復合賦值運算符 1.5 選擇作為成員或者非成員 2. 輸入和輸出運算符 2.1 輸出運算符重載 2.2 輸入運算符重載 3. 算術和關系運算符 3.1 算數(shù)運算符重載 3.2

    2024年02月11日
    瀏覽(32)
  • C++——運算符重載

    C++——運算符重載

    運算符重載,就是對已有的運算符重新進行定義,賦予其另一種功能,以適應不同的數(shù)據(jù)類型。 運算符重載的目的是讓語法更加簡潔 運算符重載不能改變本來寓意,不能改變基礎類型寓意 運算符重載的本質(zhì)是另一種函數(shù)調(diào)用(是編譯器去調(diào)用) 這個函數(shù)統(tǒng)一的名字叫opera

    2024年02月16日
    瀏覽(34)
  • C++:重載運算符

    C++:重載運算符

    1.重載不能改變運算符運算的對象個數(shù) 2.重載不能改變運算符的優(yōu)先級別 3.重載不能改變運算符的結合性 4.重載運算符必須和用戶定義的自定義類型的對象一起使用,其參數(shù)至少應該有一個是類對象,或類對象的引用 5.重載運算符的功能要類似于該運算符作用于標準類型數(shù)據(jù)

    2024年02月10日
    瀏覽(20)
  • 復習 --- C++運算符重載

    .5 運算符重載 運算符重載概念:對已有的運算符重新進行定義,賦予其另外一種功能,以適應不同的數(shù)據(jù)類型 4.5.1 加號運算符重載 作用:實現(xiàn)兩個自定義數(shù)據(jù)類型相加的運算 4.5.2 左移運算符重載 4.5.3遞增運算符重載 作用:通過重載遞增運算符,實現(xiàn)自己的整型數(shù)據(jù) 4.5.4 賦

    2024年02月07日
    瀏覽(26)
  • C++——類和對象3|日期類型|Cout運算符重載|Cin運算符重載|const成員|

    C++——類和對象3|日期類型|Cout運算符重載|Cin運算符重載|const成員|

    目錄 日期類型? Date.h? Date.cpp? Test.cpp? 實現(xiàn)Cout運算符重載? 實現(xiàn)Cin運算符重載? 根據(jù)日期算星期? 修改后完整代碼?? Date.h? Date.cpp? const成員 ?取地址及const取地址操作符重載 習題? 計算日期到天數(shù)轉換? ? ?一個類到底可以重載哪些運算符,要看哪些運算符對這個類型有

    2023年04月13日
    瀏覽(27)
  • C++中重載相等運算符 ==

    相等運算(==)是一種關系運算,與不等運算(!=)關系密切。 通常情況下,C++ 中的類通過定義相等運算符來檢驗兩個對象是否相等。也就是說它們會比較對象的每一個數(shù)據(jù)成員,只有當所有對應的 成員都相等時才認為兩個對象相等。依據(jù)這一思想,我們的 Sales_data 類的相等

    2024年02月12日
    瀏覽(17)
  • C++中重載輸出運算符 <<

    C++輸入輸出標準庫提供了“”和“”運算符執(zhí)行輸入、輸出操作,但標準庫只定義了基本數(shù)據(jù)類型的輸入、輸出操作,若要直接對類對象進行輸入、輸出,則需要在類中重載這兩個運算符。與其他運算符不同的是, 輸入、輸出運算符只能重載成類的友元函數(shù) 。 通常情況下,

    2024年02月13日
    瀏覽(32)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包