C 運算子過載

2022-04-14 12:11:46 字數 1958 閱讀 9487

1.運算子過載

通過運算子過載,可以對我們設計的類使用標準的運算子,例如+、-等。這稱為過載,因為在使用特定的引數型別時,我們為這些運算子提供了自己的實現**,其方式與過載方法相同,也是為同名方法提供不同的引數。

要過載運算子,可給類參加運算子型別成員(它們必須是static)。一些運算子有多種用途,因此我們還指定了要處理的多少個運算元,以及這些運算元的型別,一般情況下,運算元的型別與定義運算子的類相同,但也可以定義處理混合型別的運算子。

例如,考慮乙個簡單型別addclass1,如下所示:

public

class

addclass1

這僅是int值得乙個包裝器,但可以用於說明原理,對於這個類,下面的**不能編譯:

addclass1 op1 =new

addclass1();

op1.val= 3

;addclass1 op2 = new

addclass1();

op2.val=5

;addclass1 op3 = op1+op2;

其錯誤是+運算子不能應用於addclass1型別的運算元,因為我們尚未定義要執行的操作。下面的**則可執行,但無法得到預期結果:

addclass1 op1 =new

addclass1();

op1.val= 3

;addclass1 op2 = new

addclass1();

op2.val=3

;addclass1 op3 = op1==op2;

其中,使用==運算子來比較op1和op2,看它們是否引用同乙個物件,而不是驗證它們的值是否相等。在上述**中,即使op1.val和op2.val相等,op3也是false。

要過載+運算子,可使用如下**:

public

class

addclass1

}

可以看出,運算子過載看起來與標準靜態方法類似,但它們使用關鍵字operator和運算子本身,而不是乙個方法名。現在可以成功使用+運算子和這個類,如下面的示例所示:

addclass1 op3 =op1+op2;

過載所有的運算子都是一樣的,一元運算子看起來也是類似的,但只有乙個引數:

public

class

addclass1

}

這兩個運算子處理的運算元的型別與類相同,返回值也是該型別,但考慮下面的定義:

public

class

addclass1

}public

class

addclass2

public

class

addclass3

考慮下面的**就可以執行:

addclass1 op1 = new

addclass1();

op1.val=5

;addclass2 op2 = new

addclass2();

op2.val=4

;addclass3 op3 =op1+op2;

要注意,如果把相同的運算子新增到addclass2中,上面的**就會失敗,因為它弄不清要使用哪個運算子。因此,注意不要把簽名相同的運算子新增到多個類中。

還要注意,如果混合了型別,運算元的順序必須與運算子過載的引數順序相同,如果使用了過載的運算子和順序錯誤的運算元,操作就會失敗。所以,不能像這樣使用運算子:

addclass3 op3 =op2+op1;

當然,除非提供了另乙個過載運算子和倒序的引數:

public

static addclass3 operator +(addclass2 op2,addclass1 op1)

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...