2013-12-19 8 views
0
#include <iostream> 
using namespace std; 

class X 
{ 
public: 
    X() { cout<<"default constructor"<<endl; } 
    X(const X&) { cout<<"copy constructor"<<endl; } 
}; 

X test(X a) 
{ 
    X y = a; 
    return y; 
} 

int main() 
{ 
    X obj; 

    X obj1 = test(obj); 
    return 0; 
} 

Выход:конструктор копирования называется неправильно

default constructor 
copy constructor 
copy constructor 

Я скомпилировал с помощью MinGW компилятор.

Но, я думаю, что результат неправильный. Конструктор копирования вызывается, когда объект передается по значению, возвращает значение или явно копируется. В вышеуказанной программе "copy constructor" необходимо называть 4 раза.

  1. test(obj) называется, чтобы скопировать obj в a
  2. X y = a называется, явно скопирован.
  3. return y называется, y копируется во временный объект, пусть это будет temp
  4. X obj1 = temp, явно скопирована.

Пожалуйста, исправьте меня. Укажите также свое обоснование.

+0

Пожалуйста, добавьте метку языка, если это необходимо. Вы также получите автоматическую подсветку синтаксиса;) – dyp

ответ

3

Это пример так называемой «оптимизации возвращаемого значения».

Компилятор замечает, что он должен будет скопировать значение y в obj1, поэтому вместо того, чтобы вернуть его по значению и скопировать его obj1, он имеет функцию test запись в obj1 непосредственно.

См. http://en.wikipedia.org/wiki/Return_value_optimization.

1

Это пример (N) RVO, aka Оптимизация именованного возвращаемого значения. Компилятор разрешено игнорировать копии в следующем коде:

X test(X a) 
{ 
X y = a; 
return y; 
} 

Если вы написали что-то вроде этого, вместо:

X test(X a) 
{ 
X x = a; 
X y = a; 
return (true ? x : y); 
} 

(N) РВО не будет применяться.

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