LINUX.ORG.RU

где временный обьект? (С++)


0

0

такой код:
class POP{
int x;
public:
POP(){
cout << "crete pop" << endl;
x =0;
}
POP(int){
cout << "crete pop and throw int" << endl;
x = -111;
//throw int();
}

POP(POP& x){
cout << " copy POPSS" << endl;
this->x = -333;
}
~POP(){

cout << "destroy pop: " << x << endl;
}
};


где-то в недрах:
POP spop(POP(2));
и собственно вопрос: где вызов POP(2)? (т.е почему вызывается POP(int), а не POP(int), затем POP(POP&), затем ~POP(2)?)

А там вроде есть такая бодяга для инициализаций специально. Она кроме описанного еще обрабатывает синтаксис вида Object x= Object(...).

gods-little-toy ★★★
()

Оптимизация, вестимо. Нафик компилятору "лишний" объект создавать?

one_more_hokum ★★★
()

Whenever a temporary class object is copied using a copy constructor, and this object and the copy have the
same cv-unqualified type, an implementation is permitted to treat the original and the copy as two different
ways of referring to the same object and not perform a copy at all, even if the class copy constructor or
destructor have side effects. For a function with a class return type, if the expression in the return statement
is the name of a local object, and the cv-unqualified type of the local object is the same as the function
return type, an implementation is permitted to omit creating the temporary object to hold the function return
value, even if the class copy constructor or destructor has side effects. In these cases, the object is
destroyed at the later of times when the original and the copy would have been destroyed without the opti-
mization.111) [Example:
      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. ]

alex_custov ★★★★★
()

оптимизация, а теперь закрой конструктор копирования и оно отработает как надо

Reset ★★★★★
()
Ответ на: комментарий от hello_world

Ну дык и правильно. Конструктор копирования у тебя "отрабатывает" на этапе компиляции. Зачем в рантайме его дергать, если можно обойтись?

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.