簡體   English   中英

定義顯式重載構造函數問題

[英]defining explicit overloaded constructor issue

我有以下課程,某些運算符已重載:

class CLASS1
{
       CLASS1();
       CLASS1(const CLASS1 &obj);

   CLASS1 operator +(const CLASS1 &obj) {
       CLASS1 srcObj;
       // doing add stuff here
           return srcObj;
       }

   void func()
   {
   CLASS1 boj = // some method which returns CLASS1 obj.
   }


   CLASS1& operator =(const CLASS1 &obj) {
       // copy properties
       }
}

好的,這很好。 但是過了一會兒,我決定讓我的班級顯式以避免隱式轉換。 因此,我這樣做是這樣的:

class CLASS1
{
       explicit CLASS1();
       explicit CLASS1(const CLASS1 &obj);

   CLASS1 operator +(const CLASS1 &obj) {
       CLASS1 srcObj;
       // doing add stuff here
           return srcObj;          // compiler gives non-matching errors
   }

   void func() {
       CLASS1 boj = somemethods(); // compiler gives non-matching errors
   }

   CLASS1& operator =(const CLASS1 &obj) {
       // copy properties
       }
}

現在,盡管我顯式重載了賦值運算符,但編譯器給出了“沒有匹配的函數來調用...”錯誤(在上面的代碼中指定)。 我的錯誤在哪里?

當按值返回對象時,將隱式調用copy-constructor。 如果您說不允許隱式調用它,則會出現錯誤。

您不應該對explicit ,復制或移動構造函數使用explicit 或對於采用多個參數的構造函數。 僅適用於采用單個參數的構造函數(帶有注明的異常)。

從技術上講,從方法返回對象時,在方法調用外部收到的對象實際上是在方法內部聲明的對象的副本。 因此,編譯器必須具有一種允許的方法,以將方法內對象中的“內容”轉移到方法結果中。 由於不再需要方法中的實例,因此移動是最好的方法(是的,您需要添加move構造函數):

CLASS1(CLASS1&& obj);

這將允許您禁止隱式轉換,同時保持擁有臨時對象的能力。

在現實生活中,上述復制/移動很可能會通過RVO / NRVO進行優化。

暫無
暫無

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

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