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

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

Войти
Регистрация
Восстановить пароль
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
#1

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

20.01.2013, 00:24. Просмотров 271. Ответов 6
Метки нет (Все метки)

Вообщем поставил в коде вывод сообщений через 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. Это тестовый код и я знаю что там должны быть ссылки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 00:24     Не хватает одного конструктора копий
Посмотрите здесь:

Вызов конструктора копий - C++
Всех приветствую! Имеется следующий простенький код: #include &lt;iostream&gt; using namespace std; class Object { ...

Вызов конструктора копий - C++
Почему из строк 186-191 вызывается конструктор копий 83-91? #include &quot;stdafx.h&quot; #define DEBUG #define SHOW_INVARIANTS #include...

ключевое слово const в параметрах конструктора копий - C++
вот такая делема возникла))есть билдер 2006 и 2009 в 6-ом конструктор копий определен так Имя(Имя&amp;); и все прекрасно работает как надо,...

Найти минимальное время, необходимое для получения N копий одного документа на двух ксероксах - C++
Добрый день, нашёл задачку, нужно решить её методом бинарного поиска ( если будут другие варианты, то тоже спасибо ). Вот сама задачка: ...

Класс содержит более одного конструктора по умолчанию - C++
Есть класс Abonent Как мне создать массив объектов с контруктором по умолчанию? я делаю так Abonent ab;// этой же строчкой...

Класс содержит более одного конструктора по умолчанию - C++
Имеется класс: class ControlObject { private: string productsFilename; ofstream fout; ifstream fin; bool isOpenFile; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
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
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
20.01.2013, 01:01     Не хватает одного конструктора копий #4
Думаю, что просто заложена оптимизация последовательного присваивания, чтобы не создавать ненужных копий.
Этих оптимизаций огромное множество, заранее все учесть невозможно.
Запиши вместо a=b=c; просто b=c; а затем a=b; Тогда все должно быть как ты предсказывал.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
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++
#include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; class A { int *mas; int size; public: A(int size1) ...

конструкторы копий - C++
1) правильно ли я понял задание class noname { public: noname() : pstring(new std::string), i(0), d(0) {} noname(const...

Конструктор копий - C++
Можно ли вызвать в конструкторе копий, конструктор, если объекту нечего передавать? Класс - абстрактный. В конструкторе идет подсчет...


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

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

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