Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 22.06.2008
Сообщений: 24

Конструктор копий, инициализация объектов

25.07.2008, 13:47. Показов 4244. Ответов 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
#include <iostream>
 
using namespace std;
 
class myClass
{
public:
    myClass() { cout << "in myClass default constructor.\n"; }
    myClass(const myClass &ob) { cout << "in myClass copy constructor.\n"; }
    ~myClass() { cout << "in myClass destructor.\n"; }
};
 
myClass myFunc()
{
    myClass ob;
 
    return ob;
}
 
int main()
{
    myClass myOb = myFunc();
 
    return 1;
}
На экране высвечивается:
in myClass default constructor//вызывается при инициализации переменной ob
in myClass copy constructor//вызывается при копировании переменной ob во временный возвращаемый объект
in myClass destructor//вызывается при выходе из области действия переменной ob
in myClass destructor//вызывается при выходе из области действия переменной myOb

У меня к Вам следующие вопросы.
Строка:
myClass myOb = myFunc();
1. В данной строке не вызывается конструктор копий, для инициализации myOb временным возвращаемым функцией myFunc() объектом. Как происхопит инициализация переменной myOb?
2. Почему не вызывается деструктор временного возвращаемого функцией myFunc() объекта?
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.07.2008, 13:47
Ответы с готовыми решениями:

Инициализация массива объектов через конструктор
class some { public: some(){} some(int b):a(b){} void Set(int b){a=b;} private: int a; };

Инициализация объектов через конструктор(объясните в чём ошибка)
Вот программа! #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class GradeBook { public: GradeBook(); ...

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

6
 Аватар для Dr.Acula
212 / 10 / 4
Регистрация: 25.04.2007
Сообщений: 67
25.07.2008, 14:22
myClass myOb = myFunc();
1. В данной строке не вызывается конструктор копий, для инициализации myOb временным возвращаемым функцией myFunc() объектом. Как происхопит инициализация переменной myOb?
2. Почему не вызывается деструктор временного возвращаемого функцией myFunc() объекта?
Изучал в своё время механизм действия конструкторов копирования (материал тогда нашел в книге Джеффа Элджера "С++ for real programmers", которую сейчас скачать можно в сети много где).

Согласно моему представлению - всё происходит как раз наоборот.
1. Конструктор копирования в этой строке вызывается. С помощью него инициализируется копия стекового объекта, возвращаемого функцией myFunc
2. Первый деструктор - вызывается для стековой переменной ob. Второй сработавший деструктор - это как раз деструктор инициализированного конструктором копирования объекта myOb
0
0 / 0 / 0
Регистрация: 22.06.2008
Сообщений: 24
25.07.2008, 14:37  [ТС]
Проверял через отладку. Конструктор копий не вызывается. Деструктор временного объекта тоже. Вы знаете, в случаях когда возвращаемый функцией объект не используется для инициализации другого объекта, деструктор временного объекта вызывается. У меня есть предположение, что инициализируемый объект становится тем возвращаемым функцией объектом. Конструктор копий не вызывается в данном случае потому что возвращаемый функцией объект не имеет адреса, значит он не может служить параметром для конструктора копий. Но это лишь предположение.
0
 Аватар для Dr.Acula
212 / 10 / 4
Регистрация: 25.04.2007
Сообщений: 67
25.07.2008, 14:57
хм... а как же это:
На экране высвечивается:
in myClass default constructor//вызывается при инициализации переменной ob
in myClass copy constructor//вызывается при копировании переменной ob во временный возвращаемый объект
in myClass destructor//вызывается при выходе из области действия переменной ob
in myClass destructor//вызывается при выходе из области действия переменной myOb
или я чего-то не понимаю... на выходе такая строка может появиться только если конструктор копий был вызван. Почему же тогда в режиме отладки происходит что-то другое? Даже уже хочется ради интереса попробовать прогнать код )
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
25.07.2008, 16:34
внутри myFunc:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
return ob;
00411516 8D 45 EF         lea         eax,[ebp-11h]   откуда
00411519 50               push        eax  
0041151A 8B 4D 08         mov         ecx,dword ptr [ebp+8]  куда
0041151D E8 1A FB FF FF   call        myClass::myClass (41103Ch) ;конструктор копирования
00411522 8B 8D 20 FF FF FF mov         ecx,dword ptr [ebp-0E0h] 
00411528 83 C9 01         or          ecx,1 
0041152B 89 8D 20 FF FF FF mov         dword ptr [ebp-0E0h],ecx 
00411531 C6 45 FC 00      mov         byte ptr [ebp-4],0 
00411535 8D 4D EF         lea         ecx,[ebp-11h] 
00411538 E8 9A FB FF FF   call        myClass::~myClass (4110D7h) ;деструктор
0041153D 8B 45 08         mov         eax,dword ptr [ebp+8] вернем
}
В главной функции:
Code
1
2
3
4
5
6
return 1;
00411729 C7 85 2C FF FF FF 01 00 00 00 mov         dword ptr [ebp-0D4h],1 
00411733 8D 4D FB         lea         ecx,[myOb] адрес нашего объекта
00411736 E8 9C F9 FF FF   call        myClass::~myClass (4110D7h) деструктор
0041173B 8B 85 2C FF FF FF mov         eax,dword ptr [ebp-0D4h] 
}
no comments...
0
0 / 0 / 0
Регистрация: 22.06.2008
Сообщений: 24
25.07.2008, 17:43  [ТС]
Я правильно понял:
1. Простой конструктор для локальной переменной ob.
2. Конструктор копий для возвращаемого функцией значения.
3. Деструктор для локальной переменной ob.
4. Деструктор для myOb ?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
25.07.2008, 22:43
Цитата Сообщение от Maxim Chiciuc Посмотреть сообщение
У меня к Вам следующие вопросы.... [погрызено мышами]
Стандарт 12.7/15 это разрешает. Так что наблюдаемое поведение - нормальное. Смотри Example в упомянутом пункте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2008, 22:43
Помогаю со студенческими работами здесь

Конструктор копий
Добрый день! Пытаюсь разобраться с конструктором копий, а именно: когда его использовать и как реализовать. С первым, вроде как,...

Конструктор копий
Добрый день, изучая работу со списками и классы, дошел до такой проблемы: Нужно было создать односвязный список и продлить его же...

Конструктор копий
привет, как сделать конструктор копий myclass a(b); value myclass{ private: int a,b; public: myclass(myclass %mc); } ...

Классы: конструктор копий
Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка Есть некоторые наброски , посмотрите...

Конструктор копий по умолчанию.
Почему, когда в vc++ vdfsadsad Добавлено через 46 секунд Почему если идёшь по коду с заходом в функцию не отображается вызов...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru