激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 聊聊C++ 運算符重載知識

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

2022-02-21 15:35Sauron7i C/C++

運算符重載是一種形式的C++多態,重載運算符可以使代碼看起來更加自然,下面通過例子介紹下C++ 運算符重載知識,感興趣的朋友一起看看吧

前言

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

 

回顧類

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

所以在下面的例子中,拷貝構造和析構函數可以省略。

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

 

通過示例引入運算符重載

示例

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

#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;
}

這樣是可以正常輸出的:

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

再來看看運算符重載的示例,這里使用的是 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;
}

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

這里的 s1 + s2就是運用的加法運算符重載,內部實現也是對應的下標再加,但這樣簡單的寫法,強調了實質。

 

定義

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

格式:

ret_form operator op(argument-list)

例如加法運算符:

operator +();

可重載的運算符

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

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

 

本文講述的類

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

表示一個復數

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

	//構造函數
	Complex(int a, int b)
	{
		_a = a;
		_b = b;
	}
	
	//打印
	void show()
	{
		cout << _a << "+" << _b << endl;
	}
	//析構函數
	~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;
}

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

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

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

Complex operator +(const Complex& src)const;

函數實現:
這里還用到了構造函數,將其構造后返回。

//加法運算符
	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, 并且析構。

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

 

&& 運算符

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

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

實現:

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

 

cout<<運算符

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

簡易版(相當于show())

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

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

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

臻享版

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

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

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

這里就需要在類外實現,實現的方法利用友元性質,放入類中。

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

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

運行示例:
這里直接寫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 輸出了

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

但如果想要連續輸出,例如:

cout << s1 << s2;

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

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

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

同樣友元函數也寫成:

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

這樣寫的話就可以連續輸出

示例:若要輸出三個對象

cout << s1 << s2 << s3;

運行結果

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

++運算符 前置++

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

實現:
這里只針對復數的實部

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

后置++

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

實現:
參數列表里的int沒有實質意義,只是讓編譯器區分前置還是后置。

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

練習

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

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

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

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

到此這篇關于C++ 運算符重載 簡介的文章就介紹到這了,更多相關C++ 運算符重載內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/m0_56257585/article/details/121250630

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
主站蜘蛛池模板: 国产亚洲精品久久久久久久 | 精品在线免费播放 | 日产精品久久久一区二区开放时间 | 一级电影免费在线观看 | 久久91精品国产91久久yfo | 日韩精品一区二区亚洲 | 国产一区二区三区网站 | 亚洲精品成人18久久久久 | 国产精品99久久久久久久女警 | 免费国产人成网站 | 久草在线视频看看 | 99影视电影电视剧在线播放 | 色成人在线 | 欧美视频一区二区三区在线观看 | 91不雅视频 | 久久亚洲一区二区三区成人国产 | 日韩在线观看视频网站 | av在线播放亚洲 | 狠狠干狠狠操 | 日韩黄色片免费看 | 欧美黄色片免费看 | 久久艹艹艹 | 日本黄色大片免费 | 毛片免费在线观看视频 | 午夜九九九 | 国产1区2 | 免费一级欧美大片视频在线 | 青青草成人免费视频在线 | 国产69久久精品成人看 | 日本高清无遮挡 | 蜜桃麻豆视频 | 中文日韩在线视频 | 欧美3p激情一区二区三区猛视频 | 欧美黄色一级片在线观看 | 高清视频一区二区 | 制服下着マ○コ航空5 | 无码专区aaaaaa免费视频 | 男女无遮挡羞羞视频 | 媚药按摩痉挛w中文字幕 | 热re91久久精品国产99热 | 在线2区|