C 學習筆記(九) 運算子過載

2021-04-02 19:07:43 字數 1844 閱讀 8317

首先看看運算子過載的基本語法。

要過載運算子,可以給類新增運算子型別成員(它們必須是

static)。

我們先看乙個簡單的類:

public

class addclass1

這僅是

int值的乙個包裝器(

),但可以用於說明規則。

對於這個類下面的**不能編譯:

addclass1 op1 =

new addclass1();

op1.val =

5;

addclass1 op2 =

new addclass1();

op2.val =

5;

addclass1 op3 = op1 + op2;

其錯誤是

+運算子不能應用於

addclass1

型別的運算元,因為我們還沒有定義要執行的操作。

雖然下面的**可以執行,但是得不到我們希望的結果:

addclass1 op1 =

new addclass1();

op1.val =

5;

addclass1 op2 =

new addclass1();

op2.val =

5;

bool op3 = op1 == op2;

這僅是使用二元運算子

==判斷

op1和

op2是否引用的用乙個物件,而不是驗證他們的值是否相等。在這段**中,即使

op1.val

和op2.val

相等,op3

也是false

。因為它們引用的並不是同乙個物件。

我們使用下面的方法來實現對

+運算子的過載。

public

class addclass1

}

過載所有的二元運算子基本上都和這個相似。一元運算子看起來也是類似的,但是只有乙個引數。

public

static addclass1 operator

-(addclass1 op1)

下面我們再看乙個不同類的物件運算的例子。

public

class addclass1

}

public

class addclass2

public

class addclass3

對於這種型別的定義下面的**也是可以執行的:

addclass1 op1 =

new addclass1();

op1.val =

5;

addclass2 op2 =

new addclass2();

op2.val =

5;

addclass3 op3 = op1 + op2;

這是因為在

addclass1

中定義的加運算子僅適合於

addclass1

與addclass2

相加然後賦值給

addclass3

物件。而且順序必須是

addclass1

物件在前,

addclass2

物件在後的這種相加,如果要顛倒順序,除非我們按照顛倒的順序在進行乙個運算子的過載,否則是不支援這種演算法的。

下述運算子可以過載:

一元運算子:

+,-, !, ~,++,--,true,false

二元運算子:

+, -, *, /, %, &, |, ^, <<, >>

比較運算子:

==, !=, <, >, <=, >=

c 學習筆記 運算子過載

今天在看使用ceres擬合函式 的時候看到了運算子過載,由於c 當時沒學好現在也忘得差不多了,所以打算開始做乙個c 的學習筆記,看到哪寫到哪。今天看到的這段 如下 template bool operator const t const abc,t residual const 操作符過載的格式是 ...

C 學習筆記 運算子過載

自定義類可以過載運算子,大多數的運算子都是可以過載的,下表給出了那些運算子可以過載那些不可以過載。對於運算子的過載,我們需要明白運算子是如何呼叫的。非成員函式的運算子呼叫 d1 d2 表示式方式呼叫 operator d1,d2 等價的呼叫 成員函式的運算子呼叫方式 d1 d2 運算子呼叫 d1.o...

運算子過載學習筆記

定義乙個複數類complex,使之能用於複數的加法運算。編寫程式,求兩複試之和。ifndef complex h define complex h class complex endif include include complex.h complex complex complex comple...