2016-09-23 2 views
3
#include <iostream> 
using namespace std; 
class myclass { 
public: 
    myclass(); 
    myclass(const myclass &o); 
    myclass f(); 
}; 
myclass:: myclass(){ 
    cout<<"Constructing normally"<<endl; 
}; 
myclass:: myclass(const myclass &o){ 
    cout<<"Constructing copy"<<endl; 
}; 
myclass myclass::f(){ 
    myclass temp; 
    return temp; 
}; 
int main(){ 
    myclass obj; 
    obj = obj.f(); 
    return 0; 
} 

Я нашел этот пример в книге, которая показывает, что выход из программы должен быть:Когда конструктор копирования начинает работать?

Constructing normally 
Constructing normally 
Constructing copy 

Но когда я скомпилировать его в моем компиляторе он показывает только выход написанный ниже

Constructing normally 
Constructing normally 

Что на самом деле происходит внутри?

+0

это означает, что ваш компилятор оптимизировал копия далеко на второй строке 'OBJ = obj.f();' – EdChum

+0

я не мог получить его :(Можете ли вы разработать его – IAmBlake

+0

Читайте о возвращаемом значении.? оптимизация и копирование текста (ваша книга может быть старой). –

ответ

11

Ваш конструктор имеет побочный эффект - а именно: cout звонок. Поэтому компилятор не может оптимизировать копию, снятую в obj = obj.f();.

Но C++ стандарт делает позволит ей оптимизировать из глубокой копии принятых в

myclass myclass::f(){ 
    myclass temp; 
    return temp; 
}; 

несмотря там быть побочным эффектом. Эта допустимая стратегия называется Именованная оптимизация возвращаемого значения.

К сожалению, ваша книга действительно устарела или фактически неверна с самого начала! Вы можете использовать его для разжигания при освещении этих уютных пожаров в эту зиму.

+0

Sunny, вы сказали!? –

+0

@GillBates: Ha. Я должен был вернуться в офис. Теперь я что-то компилирую. – Bathsheba

+1

Вы имеете в виду «Теперь я жду, когда мой компьютер сделает всю тяжелую работу, пока я потягиваю кофе»? –

0
#include <iostream> 
using namespace std; 
class myclass { 
public: 
myclass(); 
myclass(const myclass &o); 
myclass f(); 
}; 
myclass:: myclass(){ 
cout<<"Constructing normally"<<endl; 
}; 
myclass:: myclass(const myclass &o){ 
cout<<"Constructing copy"<<endl; 
}; 
myclass myclass::f(){ 
myclass *temp; 
return *temp; 
}; 
int main(){ 
myclass obj; 
obj = obj.f(); 
return 0; 
} 
+0

попробуйте это, он даст результат: Constructing normal и Constructing copy –

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