2016-09-29 27 views
5

這是我cs課程中出現的一個最近的T/F問題,我發現有點混亂。我可以使用=運算符將一個對象的值賦給另一個對象,而不會重載運算符?

教科書規定:

=運算符可被用來將一個對象的數據分配給另一個對象,或以初始化與另一個對象的數據一個對象。默認情況下,一個對象的每個成員都被複制到另一個對象的對應對象中。

問題逐字是:

你不能使用=運算符來分配一個對象的值到另一個對象,除非你重載運算符。 T/F?

從這段教科書的特定段落來看,我回答錯了。然而,事實證明,測驗答案其實是真的。

當我在網上查詢這個問題時,我看到其他來源列出答案也是「錯誤」。當然,這些只是通用的閃卡/測驗網站,所以我不會投入太多庫存。

基本上,我只是好奇未來學習目的的真正答案是什麼。


PS:教材後繼續說:「爲了改變賦值操作符的作品,它必須被重載的方式運算符重載允許你重新定義現有運營商的行爲與類 使用時。目的。」

我覺得這是相關的,並支持「真實」的答案,但我不確定。

+1

通過此操作員將由編譯器被默認產生的電流標準。 –

+5

問題作家瘋狂起來,抱怨。 –

回答

2

聲明

你不能使用=運算符來分配一個對象的值到另一個對象,除非你重載運算符。

…是微不足道的,因爲你可以分配給例如一個int變量。哪一個是對象。在C++中。

可能他們打算編寫「類型對象」,但即使如此也是錯誤的。例如。任何POD(普通舊數據)類類型對象都是可分配的,並且缺少重載的賦值運算符。

但是,有些情況下您想要或需要禁止或負責分配。

2

如果你自己沒有實現賦值操作符,編譯器會爲你生成一個,它將把數據從源複製到目標,在可能/必要時調用你的類的成員的賦值操作符。

如果您的課程例如功能const成員,並且如果您的類包含指向動態分配的對象的指針,它不會產生所需的結果。

所以,我也想說這個陳述是錯誤的。

1

這是個詭異的問題。句法答案是「假」,但語義答案是「可能」。

struct Foo 
{ 
    int a; 
    double b; 
}; 

Foo foo1; 
Foo foo2; 
foo2 = foo1; // Ok in both senses. 

struct Bar 
{ 
    Bar() : arr(new int[20]) {} 
    ~Bar() { delete [] arr; } 
    int* arr; 
}; 

Bar bar1; 
Bar bar2; 
bar2 = bar1; // Ok in syntax not in semantics 
       // This will lead to UB 
0

你不能使用=運算符來分配一個對象的值到另一個對象,除非你重載運算符。 T/F?

答:F

可以分配一個對象的值到另一個對象沒有超載=運算符,如由默認的編譯器定義的賦值運算符的類在所有情況下,除了下面

  • 你已經明確聲明瞭複製賦值運算符(對於X類運算符=取X,X &或const X &))
  • 在您的類中存在一個不可賦值的成員(如的引用,const對象或沒有或不可訪問的賦值運算符)

但是需要明白爲什麼它變成強制性重載賦值運算符在您有用戶定義的成員或具有動態存儲器分配的情況下的一類,這個閱讀淺層和深層副本

1

的概念在C++,當User-Defined Typesclassstruct涉及那麼它更好超載operator=的類型。使用default assignment operatorclassstruct的對象將涉及Shallow CopyShallow Copy有時會導致未定義的行爲,當classstruct對象在其中動態分配內存時。

適當地超載operator=classstruct類型將導致Deep Copy,其是分配對象ObjA的正確的方法,以對象ObjBObjB = ObjA)時ObjAObjB是一些classstruct對象和包含動態分配在其內部存儲器。

=操作符可用於將一個對象的數據分配給另一個對象,或用另一個對象的數據初始化一個對象。默認情況下,一個對象的每個成員都被複制到另一個對象的對應對象中。class/struct的對象只有靜態基本內部數據類型時,這是正確的。這裏,

  • 通過靜態它意味着該對象的所有內存需求被固定在僅僅編譯時。

您不能使用default =運算符將一個對象的值分配給另一個對象,除非您重載該運算符。class/struct的對象內部有一些動態分配的內存時,可能會使用pointers

更多參考見: What is the difference between a deep copy and a shallow copy?