賦值操作符

2021-06-23 03:51:53 字數 1209 閱讀 8977

與類要控制初始化物件的方式一樣,類也定義了該型別物件賦值時會發生什麼:

sales_item trans, accum;

trans = accum;

與複製建構函式一樣,如果類沒有定義自己的賦值操作符,則編譯器會合成乙個。

過載操作符是一些函式,其名字為 operator 後跟著所定義的操作符的符號。因此,通過定義名為 operator= 的函式,我們可以對賦值進行定義。像任何其他函式一樣,操作符函式有乙個返回值和乙個形參表。形參表必須具有與該操作符數目相同的形參(如果操作符是乙個類成員,則包括隱式 this 形參)。賦值是二元運算,所以該操作符函式有兩個形參:第乙個形參對應著左運算元,第二個形參對應右運算元。

大多數操作符可以定義為成員函式或非成員函式。當操作符為成員函式時,它的第乙個運算元隱式繫結到 this 指標。有些操作符(包括賦值操作符)必須是定義自己的類的成員。因為賦值必須是類的成員,所以 this 繫結到指向左運算元的指標。因此,賦值操作符接受單個形參,且該形參是同一類型別的物件。

右運算元一般作為 const 引用傳遞。賦值操作符的返回型別應該與內建型別賦值運算返回的型別相同。內建型別的賦值運算返回對右運算元的引用,因此,賦值操作符也返回對同一類型別的引用。

例如,sales_item 的賦值操作符可以宣告為:

class sales_item ;

合成賦值操作符與合成複製建構函式的操作類似。它會執行逐個成員賦值:右運算元物件的每個成員賦值給左運算元物件的對應成員。除陣列之外,每個成員用所屬型別的常規方式進行賦值。對於陣列,給每個陣列元素賦值。

例如,sales_item 的合成賦值操作符可能如下所示:

// equivalent to the synthesized assignment operator

sales_item& sales_item::operator=(const sales_item &rhs)

合成賦值操作符根據成員型別使用適合的內建或類定義的賦值操作符,依次給每個成員賦值,該操作符返回 *this,它是對左運算元物件的引用。

可以使用合成複製建構函式的類通常也可以使用合成賦值操作符。我們的sales_item 類無須定義複製建構函式或賦值操作符,這些操作符的合成版本工作得很好。

然而,類也可以定義自己的賦值操作符。一般而言,如果類需要複製建構函式,它也會需要賦值操作符。

實際上,就將這兩個操作符看作乙個單元。如果需要其中乙個,我們幾乎也肯定需要另乙個。

賦值操作符

預設的賦值操作符用於處理同類物件之間的賦值,不要與複製建構函式混淆.如果是建立新的物件,則呼叫複製 拷貝 建構函式,如果是修改已有物件的值,則呼叫賦值操作符 myclass aclass myclass bclass aclass 呼叫複製建構函式 myclass cclass cclass acl...

C 賦值操作符

定義類時,編譯器會自動幫我們定義的有四個 建構函式 析構函式 複製建構函式 賦值操作符。賦值操作符定義了該型別的物件賦值時會發生什麼。過載操作符是一些函式,其名字為operator後跟著所定義的操作符的符號。通過定義名為operator 的函式,我們可以對賦值操作符進行定義。該函式有返回值和形參表。...

賦值操作符概要

乙個類預設有乙個賦值函式,類似這樣的 classtype operator const classtype 這個賦值函式也就是乙個簡單的 操作符的過載形式,當你要將乙個物件賦值給另乙個物件時呼叫 有關賦值函式,有以下概要問題 以string類為例 class string 1.錯誤的定義形式 str...