首先看看運算子過載的基本語法。
要過載運算子,可以給類新增運算子型別成員(它們必須是
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...