Форум программистов, компьютерный форум CyberForum.ru

Почему не вызывается конструктор копии? - C++

Восстановить пароль Регистрация
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
15.07.2013, 20:47     Почему не вызывается конструктор копии? #1
Почему не вызывается конструктор копии?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class CPoint
{
    friend std::istream &operator>>(std::istream &in, CPoint &obj);
    friend std::ostream &operator<<(std::ostream &out, const CPoint &obj);
 
public:
    CPoint(int x=0, int y=0)    { std::cout << "Конструктор CPoint(" << x << ", " << y << ")" << std::endl;  mX=x;  mY=y; }
    CPoint(const CPoint &copy)  { std::cout << "Конструктор копии CPoint(" << copy.mX << ", " << copy.mY << ")" << std::endl;  mX=copy.mX;  mY=copy.mY; }
    ~CPoint()                   { std::cout << "Деструктор ~CPoint(" << mX << ", " << mY << ")" << std::endl; }
 
private:
    int mX, mY;
};
 
 
std::istream &operator>>(std::istream &in, CPoint &obj)             { in >> obj.mX >> obj.mY;  return in; }
std::ostream &operator<<(std::ostream &out, const CPoint &obj)      { out << "[" << obj.mX << ", " << obj.mY << "]";  return out; }
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    {
    std::cout << CPoint(CPoint(0, 0)) << std::endl;
 
    std::cout << std::endl;
    }
 
    system("pause");
    return 0;
}
Результат работы:
Конструктор CPoint(0, 0)
[0, 0]
Деструктор ~CPoint(0, 0)


Для продолжения нажмите любую клавишу . . .

Внутренний CPoint(0, 0) создает объект CPoint вызовом конструктора по умолчанию
Дальше должен вызываться внешний CPoint(...). И тут вопрос, а почему не вызывается его конструктор?
Ведь для внешнего должен вызываться копирующий конструктор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.07.2013, 20:53     Почему не вызывается конструктор копии? #2
оптимизация компилятора
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 20:57     Почему не вызывается конструктор копии? #3
Цитата Сообщение от Jupiter Посмотреть сообщение
оптимизация компилятора
Оптимизация - оптимизацией. Но ведь при этом процесс выполнения программы не должен изменяться?...

Добавлено через 1 минуту
GCC с -O0 даёт такие же результаты. Или я чего-то не знаю..?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.07.2013, 21:01     Почему не вызывается конструктор копии? #4
lazybiz, для gcc опция -fno-elide-constructors

Цитата Сообщение от lazybiz Посмотреть сообщение
Но ведь при этом процесс выполнения программы не должен изменяться?...
это подобно rvo/nrvo который ЕМНИП стандарт позволяет
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
15.07.2013, 21:02  [ТС]     Почему не вызывается конструктор копии? #5
Цитата Сообщение от lazybiz Посмотреть сообщение
Но ведь при этом процесс выполнения программы не должен изменяться?...
наверно не должен.

как вообще такое может быть? ожидаешь одного результата, а на деле совсем по-другому. оптимизация эта(
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 21:05     Почему не вызывается конструктор копии? #6
BigLow, http://alenacpp.blogspot.ru/2008/02/rvo-nrvo.html (статья на русском)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 21:29     Почему не вызывается конструктор копии?
Еще ссылки по теме:

C++ Конструктор копии
C++ При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Почему конструктор вызывается при присвоении объекта другому объекту C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
15.07.2013, 21:29  [ТС]     Почему не вызывается конструктор копии? #7
lazybiz, спасибо. очень хорошая статья
Yandex
Объявления
15.07.2013, 21:29     Почему не вызывается конструктор копии?
Ответ Создать тему
Опции темы

Текущее время: 21:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru