簡體   English   中英

在C ++中重載賦值運算符的操作

[英]Operating overloading the assignment operator in c++

我最近在做一個分數類,在重載運算符時沒有得到預期的結果,我不確定為什么。 希望有人可以幫忙。 我試圖只包含相關代碼。

const fraction fraction::operator* (fraction frac)
{
    return fraction(frac.numerator * numerator, frac.denominator * denominator);
}

const fraction fraction::operator* (int num)
{
    return fraction(numerator*num, denominator);
}

fraction& fraction::operator= (const fraction &rightSide)
{
    return *this;
}

這些操作是我發現可以正常運行的那些操作(其中frac#是分數對象):

frac1 = frac2;
frac3 = frac4 * 2;
frac5 = frac6 * frac7;

上面的操作按預期方式工作,但是以下操作與初始化時一樣保留frac8:

fraction frac8(4, 5); // Initializes a fraction, setting numerator = 4, denominator = 5
frac8 = frac8 * 3; // This doesn't quite work, leaving frac8 with the original numerator/denominator

我只是不太明白為什么frac3 = frac4 * 2有效,而frac8 = frac8 * 3無效。 有任何想法嗎? 我發現在賦值運算符中使用const關鍵字不是解決方案。

如果您只是在自己身上return *this; ,您如何期望您的operator=做任何有用的事情return *this; 你要分配到的領域this領域rightSide

但是,更重要的是,如果您的類不管理需要在復制時進行某些特殊處理的資源,那么您就可以擺脫編譯器提供的賦值運算符的困擾。 它只是將一個實例的字段復制到另一個實例中,對於fraction類來說,這似乎非常好。

順便說一句,通常您使用復合運算符來實現“常規”運算符。 您可能想看看運算符重載FAQ

您的賦值都不起作用,因為您的賦值運算符實現為空,除了返回對其左側的引用外,不執行任何操作。

即這三個任務都不是

frac1 = frac2;
frac3 = frac4 * 2;
frac5 = frac6 * frac7;

真的有效。

出於某種原因,您聲稱上述分配“有效”,但這一定會使您感到困惑。 他們不“工作”。 出於相同的原因, frac8 = frac8 * 3也不起作用。

PS我懷疑您的“工作”陳述實際上是用這種方式編寫的

fraction frac1 = frac2;
fraction frac3 = frac4 * 2;
fraction frac5 = frac6 * frac7;

這可能確實有效。 但是此語法與賦值運算符無關。 在這種情況下不使用賦值運算符。 此語法對應於復制初始化 它(至少在概念上)依賴於類的復制構造函數,而不依賴於賦值運算符。 這就是為什么它可能起作用,而真正的分配不起作用的原因,因為您通過將其賦值為空來“使復制賦值運算符失去了功能”。

您的賦值運算符僅返回對象本身(即*this )...因此,在您的最后一個示例中,它只是一個空操作,而不是從右側對象執行實際的賦值操作。 換句話說,您的operator*創建了一個臨時fraction對象,但是由於您的賦值運算符沒有復制右側對象的值,因此您最終只是在operator=之后拋棄了由operator*生成的臨時fraction實例。方法完成。

順便說一句,在創建用戶生成的賦值運算符時,您可能要研究三法則 它基本上表明,如果您的類具有需要用戶生成的賦值運算符的資源,那么您還應該實現用戶定義的copy-constructor和destructor ...后兩項的編譯器生成的默認值將不會如果需要管理的資源超出了編譯器默認方法的實現范圍,那么就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM