2016-05-16 4 views
0

Я был озадачен тем, что мне пришлось написать конструктор копирования этого одного класса, когда я определил функцию внутри другого класса с типом возвращаемого первого класса.Какой из них - конструктор по умолчанию или экземпляр копии вызывает вызов, когда я определяю функцию, которая имеет (не ссылочный) тип возврата этого класса?

Например:

class Foo{ 
    // attributes 
public: 
    Foo(){...} 

    // I had to write the CC 
    Foo(const Foo& obj){ 
     //... 
    } 
} 

class Bar{ 
// .... 

// This is the function 
Foo SomeFunction() 
{ 
    Foo myVar; 

    // .... 

    return myVar; 
} 

Я проверил на cout Инг, что конструктор копирования на самом деле вызывается.

Мне нужно подтверждение, хотя, поскольку мне кажется более логичным, что в этой ситуации вызывается конструктор по умолчанию, например, в этой строке, где создается myVar.

Я новичок, поэтому я пытаюсь обвести голову этими вызовами.

+1

'myVar' - локальная переменная внутри функции, ее нужно скопировать во внешнюю переменную. – songyuanyao

+0

@songyuanyao Итак, конструктор копирования вызывается, когда это копирование происходит? – developer10

+0

Да, через копирование или копирование. – songyuanyao

ответ

3

Линия

Foo myFunc; 

вызывает конструктор по умолчанию.

Линия

return myFunc; 

вызывает конструктор копирования, так как тип возвращаемого значения функции Foo. Объект, возвращаемый функцией, не является myFunc, а копией myFunc. myFunc удаляется при возврате функции. Копия - это то, что получает вызывающая функция.

Если компилятор имеет возможность использовать RVO (return value optimization), то myFunc возвращается вызывающей функции, а не копия. В этом случае конструктор копирования не будет вызван.

+1

есть операция копирования, в зависимости от возможностей оптимизации компилятора оператор return может фактически вызвать конструктор перемещения, если применяется NRVO. –

+1

@ TheParamagneticCroissant, хорошая точка в целом. В этом конкретном случае неявно объявленный конструктор перемещения удаляется, поскольку OP имеет конструктор копирования, по крайней мере, это мое понимание. –

+0

Да, я не пытаюсь поддразнивать, просто добавил это, поскольку OP может быть заинтересован в том, чтобы знать, что в случае, если он/она столкнется с подвижным типом в будущем. –

-1

Вам не нужно писать CC на C++. Компилятор должен предоставить вам. И да, CC будет вызван в этом случае, так как вы пытаетесь передать возвращаемое значение в виде копии.

+0

По умолчанию cc не будет работать в этой конкретной ситуации, потому что я должен был инициализировать некоторые указатели. – developer10

+0

Вы не должны понижать это, потому что вы не показали полную реализацию этого класса, и то, что я сказал, полностью соответствует действительности. Если у вашего класса были атрибуты, которые на них не определены, это причина, по которой вам нужно будет указать ее при ее использовании. – Bhupesh

+0

Это был не я, который отклонил ваш ответ. – developer10

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

  • Нет связанных вопросов^_^