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

В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? - C++

Восстановить пароль Регистрация
 
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
26.03.2014, 23:06     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #1
В книге Г. Шилдта написано, что конструктор копирования может неявно вызываться, при инициализации объекта значением, которое возращает ф-я. Вот пример кода из книги. Вызов всех конструкторов/Деструкторов маркируется соотвествующими сообщениями. В книге результат(ниже приведенного кода) приводиться такой - 2 обычных конструктора + 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
 
using namespace std;
 
class myclass 
{
            int *p;
      public:
             myclass(int i);
             myclass(const myclass& ob);
             ~myclass();
             int getval() { return *p; }
};
 
myclass::myclass(int i)
{
                    cout<<"ÂûäåëåГ*ГЁГҐ ГЇГ*ìÿòè\n";
                    p=new int;
                    *p=i;
}
 
myclass::~myclass()
{
                   cout<<"ÎñâîáîæäåГ*ГЁГҐ ГЇГ*ìÿòè.\n";
                   delete p;
}
 
myclass::myclass(const myclass& obj)
{
                       p=new int;
                       *p=*obj.p;
                       cout<<"ÂûçâГ*Г* ГЄГ®Г*ñòðóêòîð êîïèðîâГ*Г*ГЁГї\n";
}
 
myclass f()
{
        myclass b(10);
        return b;
}
 
void display(myclass ob)
{
     cout<<ob.getval()<<endl;
}
 
int main()
{
    myclass copy(5);
    copy=f();        
    system("pause");
    return 0;
}
Суть вопроса: в каких же случаях вызывается конструктор копирования, и стоит ли вообще этим заморачиваться?
И почему при добавление вот такой строчки
C++
1
    cout<<copy.getval()<<endl;
выводиться на экран мусор, хотя из ф-и f() должна возвращаться копия локального объекта
Миниатюры
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 23:06     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?
Посмотрите здесь:

Сколько раз вызывается конструктор копирования C++
C++ ПОчему не вызывается конструктор копирования? Должен вызываться!
C++ <iostream> в каких случаях используется?
C++ Так в каких случаях стоит использовать наследование?
Когда вызывается конструктор копирования? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 01:44     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #2
Цитата Сообщение от mrKi Посмотреть сообщение
У меня же резальтут такой(скрин ниже)
А у меня такой (скрин). И зависание.
Миниатюры
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 01:48     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #3
Цитата Сообщение от mrKi Посмотреть сообщение
Вот пример кода из книги.
Название книги и номер страницы с кодом выложите. Существует правлило трёх: http://ru.wikipedia.org/wiki/Правило...ограммирование). Тут оно не выполняется, что странно для Шилдта.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 01:55     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #4
Цитата Сообщение от mrKi Посмотреть сообщение
Суть вопроса: в каких же случаях вызывается конструктор копирования
С.Прата.
Миниатюры
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?   В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 02:28     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #5
Цитата Сообщение от mrKi Посмотреть сообщение
И почему при добавление вот такой строчки:
C++
1
cout<<copy.getval()<<endl;
выводиться на экран мусор, хотя из ф-и f() должна возвращаться копия локального объекта
Копия возвращается (временный объект), потом значение указателя этой копии, оператором присваивания по умолчанию, присваивается указателю объекта copy, после этого копия уничтожается (при этом, вызывается деструктор, который освобождает память, на которую теперь ссылается указатель объекта copy).

C++
1
cout << f().getval() << endl;
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
27.03.2014, 02:34     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #6
mrKi, отсутствует реализация operator=. Он требуется в 49 строке.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 11:37     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #7
Нужно выполнить правило трёх.
Цитата Сообщение от mrKi Посмотреть сообщение
В книге результат(ниже приведенного кода) приводиться такой - 2 обычных конструктора + 1 конструктор копирования.
У меня же резальтут такой(скрин ниже)
Реализация другая. Вместо конструктора копирования, работает оператор присваивания, заданный по умолчанию.
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
27.03.2014, 14:35  [ТС]     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #8
alsav22, всё, я понял.
книга Шилдта, C++ Базовый курс. стр. 315-316
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 15:21     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?
Еще ссылки по теме:

C++ При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
C++ В каких случаях нужно создавать динамические переменные, а в каких статические?
Static обьект, в каких случаях применяется? C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 15:21     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? #9
Цитата Сообщение от mrKi Посмотреть сообщение
Вот пример кода из книги.
Это про этот код?
Миниатюры
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?  
Yandex
Объявления
27.03.2014, 15:21     В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?
Ответ Создать тему
Опции темы

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