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

Не хватает одного конструктора копий - C++

Восстановить пароль Регистрация
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
20.01.2013, 00:24     Не хватает одного конструктора копий #1
Вообщем поставил в коде вывод сообщений через cout, чтобы проследить кто и в какой момент запускается, и подсчитал следующий вывод :
  1. В конструкторе копий
  2. В функцие operator=()
  3. В конструкторе копий
  4. В конструкторе копий
  5. В функцие operator=()
  6. В конструкторе копий
Но похоже, что четвертого пункта нету. То есть конструктор копий запускается три раза, а должен 4.
Вот код :
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream> 
using namespace std;
 
class Array {
private:
    size_t mysize;
    int *mydata;
public:
    Array(size_t size);
    Array(Array &a);
    Array operator=(Array a);
};
 
Array::Array(size_t size){
    mysize = size;
    mydata = new int [mysize];
}
 
Array::Array(Array &a){
    mysize = a.mysize;
    mydata = new int [mysize];
    for(size_t i=0;i<mysize;i++)
        mydata[i] = a.mydata[i];
    cout << "В конструкторе копий\n";
}
 
Array Array::operator=(Array a){
    if(this != &a){
    mysize = a.mysize;
    delete [] mydata;
    mydata = new int [mysize];
    for(size_t i=0;i<mysize;i++)
        mydata[i] = a.mydata[i];
    }
    cout << "В функцие operator=()\n";
    return *this;
}
 
int main() {
    setlocale(LC_CTYPE, "Russian");
 
    Array a(10);
    Array b(20);
    Array c(30);
    c=b=a;
 
    system("pause");
    return 0;
    
}
P.S. Это тестовый код и я знаю что там должны быть ссылки.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
623 / 501 / 92
Регистрация: 28.07.2012
Сообщений: 1,338
20.01.2013, 00:45     Не хватает одного конструктора копий #2
Скорее всего выражение a=b=c; оптимизируется компилятором. Т.е. копия возвращаемая при b=c не копируется снова, а сразу передается в оператор присваивания a=.
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
20.01.2013, 00:58  [ТС]     Не хватает одного конструктора копий #3
nonedark2008, были такие мысли, но как проверить не знал, так что думал может ещё что-либо. А по каким это таким соображениям он решил, что нужно оптимизировать? Две функции идентичные были в объектных файлах?
nonedark2008
623 / 501 / 92
Регистрация: 28.07.2012
Сообщений: 1,338
20.01.2013, 01:01     Не хватает одного конструктора копий #4
Думаю, что просто заложена оптимизация последовательного присваивания, чтобы не создавать ненужных копий.
Этих оптимизаций огромное множество, заранее все учесть невозможно.
Запиши вместо a=b=c; просто b=c; а затем a=b; Тогда все должно быть как ты предсказывал.
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.01.2013, 01:10     Не хватает одного конструктора копий #5
В какой момент вы ожидаете еще один вызов конструктора копирования?
C++
1
c = b = a
можно переписать как
C++
1
c.operator=(b.operator=(a))
и тогда становится ясно, в каких местах вызывается конструктор копирования.
C++
1
2
3
b.operator=(a)  // раз
c.operator=(...) // с результатом от предыдущей операции два
// возврат предыдущей операции три, (который компилятор мог бы и оптимизировать)

Кстати, некоторые строгие компиляторы не будут компилировать ваш код. gcc, например.
nonedark2008
623 / 501 / 92
Регистрация: 28.07.2012
Сообщений: 1,338
20.01.2013, 01:31     Не хватает одного конструктора копий #6
Цитата Сообщение от lemegeton Посмотреть сообщение
В какой момент вы ожидаете еще один вызов конструктора копирования?
Когда после первого вызова = при возврате - возвращается копия объекта. А дальше ожидается, что эта копия передастся по значению(т.е. создастся ее копия) в следующее равенство. Но на практике, компилятор оптимизирует код, и в итоге ненужная копия не создается, а возвращаемое значение сразу передается на оператор.

Добавлено через 3 минуты
lemegeton, если отписать по твоему, то тут b.operator=(a) при возврате должен вызваться конструктор копирования. А потом тут c.operator=(, должна создаться копия значения, которое вернулось на предыдущем шаге.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 01:45     Не хватает одного конструктора копий
Еще ссылки по теме:

C++ Вызов конструктора копий
Класс содержит более одного конструктора по умолчанию C++
C++ Вызов конструктора копий

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.01.2013, 01:45     Не хватает одного конструктора копий #7
Цитата Сообщение от nonedark2008 Посмотреть сообщение
lemegeton, если отписать по твоему, то тут b.operator=(a) при возврате должен вызваться конструктор копирования. А потом тут c.operator=(, должна создаться копия значения, которое вернулось на предыдущем шаге.
Конечно же такое поведение будет сокращено. Это даже не оптимизация, это здравый смысл.
Yandex
Объявления
20.01.2013, 01:45     Не хватает одного конструктора копий
Ответ Создать тему
Опции темы

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