2016-10-31 2 views
2

я следующий класс, что некоторые из операторов перегружены:определение явно перегружен проблема конструктор

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 
     } 
} 

Теперь компилятор не дает «никакой функции соответствия для вызова ...» ошибки (указывается в коде выше), несмотря на я явно перегружен назначение оператор. Где моя ошибка?

ответ

2

Когда вы возвращаете объект по значению, конструктор-копия называется неявным. Если вы говорите, что не разрешено вызывать неявно, вы получите сообщение об ошибке.

Вы не должны использовать explicit для своих конструкторов по умолчанию, копирования или перемещения по умолчанию. Или для конструкторов, принимающих более одного аргумента. Только для конструкторов, принимающих один аргумент (с отмеченными исключениями).

1

Технически говоря, при возврате объекта из метода объект, который вы получаете вне метода вызова метода, фактически является копией объекта, который вы объявляете внутри метода. Поэтому компилятор должен иметь разрешенный способ «передать содержимое» из объекта in-method в результат метода. Так как в-метода экземпляра больше не нужен, этот шаг не является лучшим подходом (да, вам нужно добавить перемещения конструктора):

CLASS1(CLASS1&& obj); 

Это позволит запретить неявное преобразование, сохраняя при этом способность иметь временный объекты.

В реальной жизни исправленная копия/перемещение, скорее всего, будет оптимизирована RVO/NRVO.

Смежные вопросы