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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
#1

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

15.07.2013, 20:47. Просмотров 461. Ответов 6
Метки нет (Все метки)

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

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(...). И тут вопрос, а почему не вызывается его конструктор?
Ведь для внешнего должен вызываться копирующий конструктор
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2013, 20:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не вызывается конструктор копии? (C++):

Не вызывается конструктор копии - C++
#define st system(&quot;pause&quot;); #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class temp{ public: int a; char*p;...

Почему не вызывается конструктор перемещения? - C++
#include &lt;iostream&gt; #include &lt;vector&gt; class Object { public: Object() { std::cout &lt;&lt; &quot;Object()&quot; &lt;&lt; std::endl; ...

Почему не вызывается конструктор копирования? - C++
...У меня в книге описаны случаи при которых вызывается конструктор копирования. Один из этих случаев: : &quot;Когда аргумент имеет тип...

Почему вызывается конструктор, а не создание массива? - C++
struct KTest { KTest(int _a, double _b, long long _c) : a(_a), b(_b), c(_c) {} friend ostream&amp; operator &lt;&lt; (ostream&amp; os, KTest const&amp;...

Почему конструктор вызывается повторно при преобразовании типов? - C++
В качестве примера предлагаю рассмотреть примерчик из учебника. В примере мы создаём класс, содержащий в качестве поля строку символов и...

Почему не вызывается конструктор копирования при возврате объекта из функции - C++
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи объекта как аргумента функции ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.07.2013, 20:53 #2
оптимизация компилятора
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 20:57 #3
Цитата Сообщение от Jupiter Посмотреть сообщение
оптимизация компилятора
Оптимизация - оптимизацией. Но ведь при этом процесс выполнения программы не должен изменяться?...

Добавлено через 1 минуту
GCC с -O0 даёт такие же результаты. Или я чего-то не знаю..?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 21:05 #6
BigLow, http://alenacpp.blogspot.ru/2008/02/rvo-nrvo.html (статья на русском)
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
15.07.2013, 21:29  [ТС] #7
lazybiz, спасибо. очень хорошая статья
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 21:29
Привет! Вот еще темы с ответами:

Почему не вызывается ни конструктор копий, ни функция перегруженного оператора присвоения - C++
Привет. Начал изучать C++, дошел до темы перегрузки операторов. И запарился на одном месте. Есть класс Dog: class Dog { public:...

Почему конструктор вызывается при присвоении объекта другому объекту - C++
оператор+ выполняется нормально, но когда уже переменная в sum, на след шаге она вызывает конструктор, ибо у меня в примере 9 выходит. А в...

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О - C++
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.07.2013, 21:29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru