Инициализация объектов. конструктор копирования.

#include <iostream>using namespace std;class myClass{public:    myClass() { cout << "in myClass default constructor.\n"; }    myClass(const myClass &ob) { cout << "in myClass copy constructor.\n"; }    ~myClass() { cout << "in myClass destructor.\n"; }};myClass myFunc(){    myClass ob;    return ob;}int main(){    myClass myOb = myFunc();    return 1;}
На экране высвечивается:
in myClass default constructor//вызывается при инициализации переменной obin myClass copy constructor//вызывается при копировании переменной ob во временный возвращаемый объектin myClass destructor//вызывается при выходе из области действия переменной obin myClass destructor//вызывается при выходе из области действия переменной myOb
У меня к Вам следующие вопросы.Строка:    myClass myOb = myFunc();1. В данной строке не вызывается конструктор копий, для инициализации myOb временным возвращаемым функцией myFunc() объектом. Как происхопит инициализация переменной myOb?2. Почему не вызывается деструктор временного возвращаемого функцией myFunc() объекта?Спасибо.
10 ответов

В данной строке не вызывается конструктор копий, 
с чего вы взяли?
Почему не вызывается деструктор временного возвращаемого функцией myFunc() объекта?
А он разве создается?


Он создается конструктором копий, в котором аргументом является ob.


Он создается конструктором копий, в котором аргументом является ob. 
В таких случаях помогает отладочный вывод ещё и адресов объектов;)


Я этим и воспользовался. То что написано в коментариях при выводе, я получил в режиме отладки. 


Я этим и воспользовался. То что написано в коментариях при выводе, я получил в режиме отладки.  
Вы не выводите адреса объектов. Тогда бы вам было всё понятно. Но даже логически понятно, что просто один из объектов не создается из-за оптимизации.


1. В данной строке не вызывается конструктор копий, для инициализации myOb временным возвращаемым функцией myFunc() объектом. Как происхопит инициализация переменной myOb?
Вот тебе ответ из Стандарта:
class Thing { public:    Thing();    ~Thing();    Thing(const Thing&);    Thing operator=(const Thing&);    void fun();};Thing f(){    Thing t;    return t;}Thing t2 = f();
Here t does not need to be copied when returning from f. The return value of f may be constructed directly into the object t2. 
Насчет обоих деструкторов, как их увидеть не только во время отладки, но и во время выполнения. Перепиши деструктор вот так:
~myClass() { cout << "in myClass destructor.\n";system("pause"); }


Annihilator, большое Вам спасибо! Можете подсказать откуда Вы взяли этот фрагмент кода?


Annihilator, большое Вам спасибо! Можете подсказать откуда Вы взяли этот фрагмент кода?
Стандарт С++ за 98 год, пункт  12.8.15


in myClass copy constructor//вызывается при копировании переменной ob во временный возвращаемый объект...myClass myOb = myFunc();1. В данной строке не вызывается конструктор копий, для инициализации myOb временным возвращаемым функцией myFunc() объектом. Как происходит инициализация переменной myOb?
Почему-то эту фразу не откомментировали (или я не заметил). В приведенном выражении вызывается именно конструктор копий. Он эквивалентен такому коду:
myClass myOb( myFunc() );
А ваш комментарий (в цитате) неверен, как уже было отмечено выше хорошей ссылкой на стандарт: переменная ob во временный объект не копируется. то есть тот вызов копиктора, который отмечен в консоли относится именно к 
myClass myOb = myFunc();


А ваш комментарий (в цитате) неверен, как уже было отмечено выше хорошей ссылкой на стандарт: переменная ob во временный объект не копируется.
Стандарт разрешает устранение любого из этих копирований или обоих сразу.