C 過載運算子實現複數的操作

2021-08-20 09:47:59 字數 3089 閱讀 3542

**結構:complex.h定義類。complex.cpp定義了成員函式。main.cpp驗證功能。

**的解釋全都嵌在**上了,只貼**:

complex.h:

#pragma once

namespace ns_complex ;

}

complex.cpp:

#include"complex.h"

#include namespace ns_complex

complex::complex(float x, float y)

complex::~complex()

void complex::reset()//重置清零操作

complex complex::operator + (const complex& a) const//'+'

complex complex::operator - (const complex& a) const//'-'

complex complex::operator * (const complex& a) const//'*'

complex complex::operator / (const complex& a) const//'/' 分子分母同時乘以分母的共軛,那麼分母會變成乙個常數,相當於分子的結果除以常數

complex complex::operator * (float a)//複數乘以常數,後置常數

complex operator * (const float a,const complex& a)//複數乘以常數,前置常數 注意這個函式並不是complex的成員函式

;//拷貝建構函式,我們不需要單獨定義,編譯器會幫我們自動生成乙個物件之間的淺拷貝的建構函式,這對於我們來說足夠用了.但是對於那種有一部分成員變數不需要複製的時候,需要用到第二種做法。

return b;

//第二種做法(無需宣告友元的方法):這種方法即使函式不是成員函式也可以。但是因為引數列表裡面的a是常,所以需要生成乙個非const變數return出去

complex c;

return c * a;

// 此種方法並不需要真正得把這個函式宣告為類的友元函式。

} complex complex::operator + (float a)//複數加常數

complex operator + (const float a, const complex& a)//常數加複數

;//拷貝建構函式,我們不需要單獨定義,編譯器會幫我們自動生成乙個物件之間的淺拷貝的建構函式,這對於我們來說足夠用了.但是對於那種有一部分成員變數不需要複製的時候,需要用到第二種做法。

return b;

//第二種做法:

complex c;

return c + a;

} complex complex::operator - (float a)//複數減常數

; }complex operator - (const float a, const complex& a)//常數減複數

;//拷貝建構函式,我們不需要單獨定義,編譯器會幫我們自動生成乙個物件之間的淺拷貝的建構函式,這對於我們來說足夠用了.但是對於那種有一部分成員變數不需要複製的時候,需要用到第二種做法。

return b;

//第二種做法:

complex c;

return -(c - a);//前面這個負號我要我們過載之後才能支援。千萬別按照數學的邏輯吧這個括號消除。哈

} complex complex::operator / ( const float a)//複數除以常數 記住這裡的返回值不能為引用

complex operator / (const float a, const complex& a)//常數除以負數

complex& complex::operator -()//複數取反 此運算子是前置的,所以括號中不需要引數,而this指標是隱含存在的

complex& complex::operator ~()//取共軛 此運算子是前置的,所以括號中不需要引數,而this指標是隱含存在的

void complex::show() const//展示複數

}

main.cpp:

// main.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "complex.h"

#include using namespace std;

using namespace ns_complex;

int main()

;//列表初始化,此處如果不加f,那麼常數在儲存時預設為是double,編譯會報錯:double轉化為float是縮窄轉化

complex c = a + b;

c.show();

//減法測試

complex d;

complex e;//列表初始化

complex f = -(d - e);//包含了取反運算

f.show();

//乘法測試

complex j;//int可以轉化為float

complex h;//列表初始化

complex i = ~(10*j * h *10);//這裡面既包含了前置乘以常數,又包含了後置乘以常數。

i.show();

//除法測試

complex g;

complex k;//列表初始化

complex l = g / k;

l.show();

cin.get();

return 0;

}

運算結果:

[2.001,3.001]

[-5.000,-5.001]

[-500.000,-2501.000]

[5.308,-0.462]

這是乙個關於過載和友元的簡單例子。不過發現由於建構函式是引數為float的,但是直接寫complex(2.0,3.0)竟讓編譯報錯:無法從double縮窄成float,看來是由於常量2.0的儲存是double的形式,所以加乙個f來顯式的指出是float型別的。

複數(過載運算子 重寫ToString)

using system using system.collections.generic using system.linq using system.text 過載加號運算子 public static complex operator complex c1,complex c2 重寫結構com...

複數類 過載運算子2

定義乙個複數類complex,過載運算子 使之能用於複數的加法運算。參加運算的兩個運算量可以都是類物件,也可以其中有乙個是整數,順序任意。例如,c1 c2,i c1,c1 i均合法 設i為整數,c1,c2為複數 編寫程式,分別求兩個複數之和 整數和複數之和。兩個複數 乙個複數和乙個整數 乙個整數和乙...

2441複數類過載運算子

檔名稱 array.cpp 作 者 李中意 完成日期 2014 年7月 7 日 版本號 v1.0 輸入描述 無 include include using namespace std class complex complex double r,double i complex operator c...