C 運算子過載

2022-07-22 10:15:15 字數 3996 閱讀 6061

可以重定義或過載 c# 中內建的運算子。因此,程式設計師也可以使用使用者自定義型別的運算子。過載運算子是具有特殊名稱的函式,是通過關鍵字operator後跟運算子的符號來定義的。與其他函式一樣,過載運算子有返回型別和引數列表。

例如,請看下面的函式:

public

static box operator+(box b, box c)

上面的函式為使用者自定義的類 box 實現了加法運算子(+)。它把兩個 box 物件的屬性相加,並返回相加後的 box 物件。

class

user

public

void setfollows(int

follw)

public

intgetdiffer()

//過載運算子

public

static user operator+(user ua,user ub)

}}

ua differ : 114514

ub differ :

42uc differ :

114556

operator 關鍵字用於在類或結構宣告中宣告運算子。運算子宣告可以採用下列四種形式之一:

public

static result-type operator unary-operator ( op-type operand )

public

static result-type operator binary-operator ( op-type operand, op-type2 operand2 )

public

static

implicit

operator conv-type-out ( conv-type-in

operand )

public

static

explicit

operator conv-type-out ( conv-type-in operand )

引數:注意:

前兩種形式宣告了使用者定義的過載內建運算子的運算子。並非所有內建運算子都可以被過載(請參見可過載的運算子)。op-type 和 op-type2 中至少有乙個必須是封閉型別(即運算子所屬的型別,或理解為自定義的型別)。例如,這將防止重定義整數加法運算子。

後兩種形式宣告了轉換運算子。conv-type-in 和 conv-type-out 中正好有乙個必須是封閉型別(即,轉換運算子只能從它的封閉型別轉換為其他某個型別,或從其他某個型別轉換為它的封閉型別)。

運算子只能採用值引數,不能採用 ref 或 out 引數。

c# 要求成對過載比較運算子。如果過載了==,則也必須過載!=,否則產生編譯錯誤。同時,比較運算子必須返回bool型別的值,這是與其他算術運算子的根本區別。

c# 不允許過載=運算子,但如果過載例如+運算子,編譯器會自動使用+運算子的過載來執行+=運算子的操作。

運算子過載的其實就是函式過載。首先通過指定的運算表示式呼叫對應的運算子函式,然後再將運算物件轉化為運算子函式的實參,接著根據實參的型別來確定需要呼叫的函式的過載,這個過程是由編譯器完成。

任何運算子宣告的前面都可以有乙個可選的屬性(c# 程式設計指南)列表。

下表描述了 c# 中運算子過載的能力:

運算子描述

+, -, !, ~, ++, --

這些一元運算子只有乙個運算元,且可以被過載。

+, -, *, /, %

這些二元運算子帶有兩個運算元,且可以被過載。

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

這些比較運算子可以被過載。

&&, ||

這些條件邏輯運算子不能被直接過載。

+=, -=, *=, /=, %=

這些賦值運算子不能被過載。

=, ., ?:, ->, new, is, sizeof, typeof

這些運算子不能被過載。

public

static

void

run()

");user ub = new

user();

ub.setfans(

42);

ub.setfollows(

618);

console.writeline($

"ub differ : ");

user uc = ua +ub;

console.writeline($

"uc differ : ");

console.writeline($

"ua-ub differ : ");

console.writeline($

"ua+ub differ : ");

console.writeline($

"ua*ub differ : ");

console.writeline($

"ua/ub differ : ");

console.writeline($

"ua>ub : ");

console.writeline($

"ua"

); console.writeline($

"ua<=ub : ");

console.writeline($

"ua>=ub : ");

console.writeline($

"ua!=ub : ");

console.writeline($

"ua==ub : ");

}class

user

public

void setfollows(int

follw)

public

intgetdiffer()

//過載運算子

public

static user operator+(user ua,user ub)

public

static user operator /(user ua, user ub)

public

static user operator *(user ua, user ub)

public

static user operator -(user ua, user ub)

public

static

bool

operator

<(user ua, user ub)

public

static

bool

operator >(user ua, user ub)

public

static

bool

operator

<=(user ua, user ub)

public

static

bool

operator >=(user ua, user ub)

public

static

bool

operator!=(user ua, user ub)

public

static

bool

operator==(user ua, user ub)

}

ua differ : 114514

ub differ :

42uc differ :

114556

ua-ub differ : 114472

ua+ub differ : 114556

ua*ub differ : 4809588

ua/ub differ : 2726

ua>ub : true

uaua<=ub : false

ua>=ub : true

ua!=ub : true

ua==ub : false

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

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

C 運算子過載賦值運算子

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

C 運算子過載轉換運算子

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