C 運算子過載的基本概念

2022-01-09 21:46:01 字數 1834 閱讀 3612

c++ 預定義的運算子,只能用於基本資料型別的運算:整型、實型、字元型、邏輯型等等,且不能用於物件的運算。但是我們有時候又很需要在物件之間能用運算子,那麼這時我們就要過載運算子,使得運算子能用於物件之間的運算。

比如,在數學上,兩個複數可以直接進行+、-等運算,但在c++中,直接將+或-用於複數物件是不允許的。有時會希望,讓物件也能通過運算子進行運算。這樣**就更簡潔,也容易理解。

例如:complex_a 和 complex_b 是兩個複數物件,求兩個複數的和,希望的能直接寫成:complex_a + complex_b

這時我們就需要對+號運算子進行過載。

運算子過載的實質就是函式過載,可以過載為普通函式,也可以過載為成員函式。運算子過載的基本形式如下:

返回值型別 operator 運算子(形參表)

下面舉個例子,實現對複數物件的+-運算子過載:

class complex // 複數類

// 過載-號運算子,屬於成員函式

complex operator-(const complex & c)

// 列印複數

void printcomplex()

// 將過載+號的普通函式,定義成友元函式

// 目的是為了友元函式能訪問物件的私有成員

friend complex operator+(const complex &a, const complex &b);

private:

double m_real; // 實部的值

double m_imag; // 虛部的值

};// 過載+號運算子,屬於普通函式,不是物件的成員函式

complex operator+(const complex &a, const complex &b)

int main()

輸出結果:

3,3

1,1

從上面的例子中,我們可以知道過載為成員函式和普通函式的區別了:

在上面的**中,我把過載+號運算子的普通函式,在complex複數類中定義成了友元函式,目的是為了友元函式能訪問物件的私有成員,否則會編譯報錯。

這裡還有個值得思考的問題:

// 過載-號運算子,屬於成員函式

complex complex::operator-(const complex & c)

首先先說一下參數列為什麼是const complex & c常引用型別,首先如果參數列如果普通的物件形式complex c,那麼在入參的時候,就會呼叫預設的賦值(拷貝)建構函式,產生了乙個臨時物件,這會增大開銷,所以就採用引用的方式,同時又為了防止引用的物件被修改,所以就定義成了const complex & c常引用型別。

再來說一下返回值為什麼是普通complex物件,因為本次 - 號和 + 號運算子的函式執行之後,需要返回乙個新的物件給到左值。

11 運算子過載的基本概念

c 預定義的運算子,只能用於基本資料型別的運算 整型,實型,字元型,邏輯型。不能用於物件的運算,有時候又需要物件之間的運算。在數學上,兩個符數可以直接進行 等運算。但是在c 中,直接將 或者 用於複數物件是不允許的。有時候希望,讓物件也能通過運算子進行計算。這樣 更加簡介,更加易於理解。例如 com...

c 運算子過載以及一些基本概念

c primer第四版435 1.賦值 下標 呼叫 成員訪問箭頭 等操作符必須定義為成員,定義為非成員時,編譯器報錯 2.像賦值一樣,符合賦值操作符通常應定義為類的成員,但是定義為非成員的復合賦值操作符時不會出現編譯錯誤 3.改變物件狀態或給定型別緊密聯絡的其他一些操作符,如自增,自減和解引用,通常...

4 1 C 運算子基本概念

目錄4.1.2 優先順序 結合律與求值順序 一些運算子指定了求值順序 再述求值順序 操作符可視為乙個函式,用引數,返回值來分析它 如cout 操作符 操作符的返回值可以分為左值 lvalue 和右值 rvalue 對指定的類重新定義某些操作符的操作,但無法改變其運算物件的個數,優先順序和結合律 c ...