LINUX.ORG.RU

Конструктор копирования в gcc


0

0

Написал свои классы матриц и векторов. Написал для них конструкторы
копирования, все как обычно, методы должны для возврата результатов
использовать конструктор копирования. Например, сигнатура оператора
умножения матриц:
 Matrix operator*(Matrix &).

Все работает вроде нормально, но когда я добавил матрицам имена
(например, Matrix a(3,3, "a")) и начал следить за временем жизни
объектов (добавив в конструкторы, деструкторы и операторы вывод
сообщений о выполняемых действиях) заметил что временные объекты ведут
себя не так как я ожидал. Например, в операторе сложения (без
проверок):
  Matrix Matrix::operator+(Matrix &m) {
     cout << mName << "::operator+(" << m.mName << ")" << endl;
     Matrix t(mRow, mCols, "temp" /* имя генерируется случайной
последовательностью латинских символов */);
     t += m;
     return t;
  }

Теперь к примеру для следующего кода:
  Matrix a(3,3, "a"), b(3,3, "b"), c(3,3, "c");
  c = a + b;

будет выведены сообщения:
  Matrix "a" created
  Matrix "b" created
  Matrix "c" created
  a::operator+(b)
  Matrix "kdjlkj" created
  c::operator=(kdjlkj)
  Matrix "kdjlkj" destroyed
  Matrix "c" destroyed
  Matrix "b" destroyed
  Matrix "a" destroyed

Т.е. получается после того как оператор+ создал временный объект в
стеке, он его не уничтожил при выходе. При возврате из метода не был
вызван конструктор копирования (в нем также есть вывод сообщений),
т.е. что получается? Аргументом оператора= был объект из стека,
который должен быть по идее уже переписан данными при вызове
присваивания? Что вообще происходит?

Держись, Чиппи, мы идем!

12.8 - Copying class objects [class.copy]

-15- 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.

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

Спасибо за такую оперативность! Гугл говорит, что это выдержка из стандарта, значит будем читать матчасть.. Особенно про cv-*, в этом у меня полный пробел...

sotlef
() автор топика
Ответ на: комментарий от sotlef

> Особенно про cv-*, в этом у меня полный пробел...

cv-qualification -- это const и volatile флаги которыми помечен объект.

dilmah ★★★★★
()

гм, а где t инициализируется содержимым текущей матрицы?

cobold ★★★★★
()

А еще говорят, что C++ - не угребище. И что на нем можно писать нормальные надежные программы. И что писать на нем намного легче чем на C. Думаю, само появление такой темы отлично показывает, ЧТО из себя представляет язык C++.

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