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

聊聊C++ 運算符重載知識

 更新時間:2021年11月11日 14:38:28   作者:Sauron7i  
運算符重載是一種形式的C++多態(tài),重載運算符可以使代碼看起來更加自然,下面通過例子介紹下C++ 運算符重載知識,感興趣的朋友一起看看吧

前言

1.運算符重載是一種形式的C++多態(tài)。
2.重載運算符可以使代碼看起來更加自然。

回顧類

在正常構(gòu)造類的時候,有些成員方法可以不用寫出來,例如在這樣一個表示時間的類中,拷貝構(gòu)造函數(shù)只是淺拷貝,和系統(tǒng)默認的步驟是一樣的,可以不用寫了。 同樣,析構(gòu)函數(shù)如果在對象死亡之前沒有必須要做的事情,也可以不用寫。

所以在下面的例子中,拷貝構(gòu)造和析構(gòu)函數(shù)可以省略。

class Time
{
public:
	Time();
	Time(const Time& src)
	{
		_hour = src._hour;
		_minutes = src._minutes;
	}
	~Time();
private:
	int _hour;
	int _minutes;
};

通過示例引入運算符重載

示例

若要將兩個等數(shù)組中各個下標對應的字符相加,普通寫法為:

#include<iostream>
using namespace std;
int main(void)
{
	const int SIZE = 10;
	int ch1[SIZE] = { 0,1,2,3,4,5,6,7,8,9 };
	int ch2[SIZE] = { 9,8,7,6,5,4,3,2,1,0 };
	int ch3[SIZE];

	for (int i = 0; i < SIZE; ++i)
	{
		ch3[i] = ch1[i] + ch2[i];
	}
	
	for (int i = 0; i < SIZE; ++i)
	{
		cout << ch3[i] << " ";
	}
	cout << endl;
	return 0;
}

這樣是可以正常輸出的:

在這里插入圖片描述

再來看看運算符重載的示例,這里使用的是 string 類。

#include<iostream>
#include<string>
using namespace std;

int main(void)
{
	string s1 = "aaaa";
	string s2 = "bbbb";
	string s3 = s1 + s2;

	cout << s3 << endl;
	return 0;
}

在這里插入圖片描述

這里的 s1 + s2就是運用的加法運算符重載,內(nèi)部實現(xiàn)也是對應的下標再加,但這樣簡單的寫法,強調(diào)了實質(zhì)。

定義

要重載運算符,需要使用被稱為運算符函數(shù)的特殊函數(shù)形式。

格式:

 ret_form operator op(argument-list)

例如加法運算符:

operator +();

可重載的運算符

這里開個玩笑,列出這寫可重載的,大家有興趣可以自己實現(xiàn)。

在這里插入圖片描述

本文講述的類

下面是文章示例的一個類:

表示一個復數(shù)

class Complex
{
public:
	//默認構(gòu)造
	Complex();

	//構(gòu)造函數(shù)
	Complex(int a, int b)
	{
		_a = a;
		_b = b;
	}
	
	//打印
	void show()
	{
		cout << _a << "+" << _b << endl;
	}
	//析構(gòu)函數(shù)
	~Complex()
	{
		cout << "Program Exit" << endl;
	}

private:
	int _a; //實部
	int _b; //虛部
}

加法運算符

如果要使用到加法,如

int main(void)
{
	Complex s1(1, 2);
	Complex s2(2, 3);

	Complex s3 = s1 + s2;
	
	return 0;
}

那首先要確定,我不能改變加數(shù)原本的值,其次,我需要返回一個加完之后的類。

那重載加法運算符聲明就可寫成:

1.返回類型為 類 類型
2.this指針聲明成const
3.第二個加數(shù)聲明為const

Complex operator +(const Complex& src)const;

函數(shù)實現(xiàn):
這里還用到了構(gòu)造函數(shù),將其構(gòu)造后返回。

//加法運算符
	Complex operator +(const Complex& src)const
	{
		int a = _a + src._a;
		int b = _b + src._b;
		return Complex(a, b);
	}

使用運算符的兩種方式:

s3和s4用到的方式都可以

	Complex s1(1, 2);
	Complex s2(2, 3);

	Complex s3 = s1 + s2;
	Complex s4 = s1.operator+(s2);

運行示例:
輸出了 s3 和s4, 并且析構(gòu)。

在這里插入圖片描述

&& 運算符

比如要寫一個方法來判斷兩個復數(shù)的實部是否都為0.

	if (s1 && s2)
	{
		cout << "all zero" << endl;
	}

實現(xiàn):

	//&&
	bool operator &&(const Complex& src)const
	{
		return _a && src._a;
	}

cout<<運算符

想要重載輸出運算符,首先想到的是將 cout 當作參數(shù)傳遞給函數(shù)。

簡易版(相當于show())

	//cout <<
	void operator <<(ostream& out)
	{
		out << _a << "+" << _b << "i" << endl;
	}

這樣重載的話,就只能當作show()方法一樣調(diào)用。而不能直接使用cout。

在這里插入圖片描述

臻享版

首先要知道,cout是一個二元運算符,那我們傳遞參數(shù)的時候,也是傳遞兩個參數(shù),向上面的簡易版,第一個參數(shù)為this指針, 第二個才是cout ,如果想把this指針移到第二個參數(shù)位置,是辦不到的,所以只能當作show方法的樣子來寫。

void operator <<(/*this*/ostream& out)
	{
		out << _a << "+" << _b << "i" << endl;
	}

解決方法:
把要輸出的參數(shù)放在第二個位置。

這里就需要在類外實現(xiàn),實現(xiàn)的方法利用友元性質(zhì),放入類中。

如圖所示,我確實是在類外寫的。

在這里插入圖片描述

運行示例:
這里直接寫cout << s1

int main(void)
{
	Complex s1(1, 2);
	Complex s2(2, 3);

	Complex s3 = s1 + s2;
	Complex s4 = s1.operator+(s2);

	s3.show();
	s4.show();
	//s1.operator<<(cout);
	cout << s1;

	return 0;
}

沒有問題,把 1+2i 輸出了

在這里插入圖片描述

但如果想要連續(xù)輸出,例如:

cout << s1 << s2;

我像上面那樣寫就不行了,因為這個方法的返回類型是void,函數(shù)參數(shù)先接收 cout 和 s1, 然后返回void,將void 和 s2又當作參數(shù)傳遞過去,顯然是不行的。

解決方法:
將這個方法的返回類型寫成輸出流對象, 即ostream

ostream& operator <<(ostream& out, const Complex& src)
{
	out << src._a << "+" << src._b << "i" << endl;
	return out;
}

同樣友元函數(shù)也寫成:

friend ostream& operator <<(ostream& out, const Complex& src);

這樣寫的話就可以連續(xù)輸出

示例:若要輸出三個對象

cout << s1 << s2 << s3;

運行結(jié)果

在這里插入圖片描述

++運算符 前置++

前置++的意思是先 自加1,再返回。

實現(xiàn):
這里只針對復數(shù)的實部

	//前置++
	Complex& operator ++()
	{
		++_a;
		return *this;
	}

后置++

后置++的意思是先傳值,再自增1 。

實現(xiàn):
參數(shù)列表里的int沒有實質(zhì)意義,只是讓編譯器區(qū)分前置還是后置。

	//后置++
	Complex operator ++(int)
	{
		int tmp = _a;
		_a++;
		return Complex(tmp, _b);
	}

練習

通過上面介紹的這些運算符重載,可以寫出其他一些。

這里可以實現(xiàn)有
減法運算符、 ||運算符、 >>運算符 和 自減運算符(- -)。

例如減法運算符:和加法一樣的寫法:

	//減法運算符
	Complex operator -(const Complex& src)const
	{
		int a = _a - src._a;
		int b = _b - src._b;
		return Complex(a, b);
	}

到此這篇關(guān)于C++ 運算符重載 簡介的文章就介紹到這了,更多相關(guān)C++ 運算符重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析string類字符串和C風格字符串之間的區(qū)別

    淺析string類字符串和C風格字符串之間的區(qū)別

    string類是標準庫的類,并不是內(nèi)置類型,標準庫就像是我們自己定義的類差不多的,string類型對象沒有標配'\0'結(jié)尾的
    2013-09-09
  • C語言棧與隊列相互實現(xiàn)詳解

    C語言棧與隊列相互實現(xiàn)詳解

    棧和隊列,嚴格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,本章講解分別用隊列實現(xiàn)棧與用棧實現(xiàn)隊列
    2022-04-04
  • 用C語言winform編寫滲透測試工具實現(xiàn)SQL注入功能

    用C語言winform編寫滲透測試工具實現(xiàn)SQL注入功能

    本篇文章主要介紹使用C#winform編寫滲透測試工具,實現(xiàn)SQL注入的功能。使用python編寫SQL注入腳本,基于get顯錯注入的方式進行數(shù)據(jù)庫的識別、獲取表名、獲取字段名,最終獲取用戶名和密碼;使用C#winform編寫windows客戶端軟件調(diào)用.py腳本,實現(xiàn)用戶名和密碼的獲取
    2021-08-08
  • 利用Qt實現(xiàn)可擴展對話框的示例代碼

    利用Qt實現(xiàn)可擴展對話框的示例代碼

    可擴展對話框通常用于用戶對界面有不同要求的場合。當供高級用戶使用或需要更多信息時,可通過某種方式的切換顯示完整對話窗體(擴展窗體)。本文將用Qt實現(xiàn)可擴展對話框,需要的可以參考一下
    2022-06-06
  • 淺析C++ new的三種面貌

    淺析C++ new的三種面貌

    這篇文章主要介紹了C++ new的三種面貌,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下
    2020-08-08
  • 如何在c++中實現(xiàn)字符串分割函數(shù)split詳解

    如何在c++中實現(xiàn)字符串分割函數(shù)split詳解

    這篇文章主要給大家介紹了關(guān)于如何在c++中實現(xiàn)字符串分割函數(shù)split的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用c++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • C++實現(xiàn)走迷宮小游戲

    C++實現(xiàn)走迷宮小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)走迷宮小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • c++ fstream 文件追加模式示例詳解

    c++ fstream 文件追加模式示例詳解

    本文給大家介紹c++ fstream 文件追加模式示例詳解,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-10-10
  • C++類與對象深入之運算符重載與const及初始化列表詳解

    C++類與對象深入之運算符重載與const及初始化列表詳解

    運算符是程序中最最常見的操作,例如對于內(nèi)置類型的賦值我們直接使用=賦值即可,因為這些編譯器已經(jīng)幫我們做好了,但是對象的賦值呢?能直接賦值嗎
    2022-06-06
  • C++?Boost?Spirit進階教程

    C++?Boost?Spirit進階教程

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11

最新評論

富川| 罗甸县| 五大连池市| 高雄市| 新晃| 蕉岭县| 洪洞县| 金平| 绍兴市| 惠州市| 平遥县| 崇明县| 鄄城县| 庆城县| 志丹县| 基隆市| 四会市| 台南市| 怀化市| 咸宁市| 郸城县| 厦门市| 库伦旗| 阿瓦提县| 大洼县| 武强县| 横山县| 商南县| 宣武区| 大埔区| 通化市| 锦州市| 潼关县| 三门峡市| 门头沟区| 福清市| 舟曲县| 夏邑县| 岳普湖县| 宁晋县| 四川省|