Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
#1

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

26.03.2014, 23:06. Просмотров 761. Ответов 8
Метки нет (Все метки)

В книге Г. Шилдта написано, что конструктор копирования может неявно вызываться, при инициализации объекта значением, которое возращает ф-я. Вот пример кода из книги. Вызов всех конструкторов/Деструкторов маркируется соотвествующими сообщениями. В книге результат(ниже приведенного кода) приводиться такой - 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() должна возвращаться копия локального объекта
0
Миниатюры
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 23:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? (C++):

Написать, в каких случаях не используется конструктор копирования - C++
2)Написать, в каких случаях не используется конструктор копирования

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

Когда вызывается конструктор копирования? - C++
Пожалуйста помогите ответить на вопрос &quot;Когда вызывается конструктор копирования?&quot;

Сколько раз вызывается конструктор копирования - C++
Почему n не увеличивается? Point(const Point&amp; src){ n++; set(src.x+1, src.y+1); cout &lt;&lt; &quot;Konstruction copyrovanija...

Так в каких случаях стоит использовать наследование? - C++
Здравствуйте, уважаемое сообщество. После прочтения &quot;C++ Coding Standards&quot; by Herb Sutter and Andrei Alexandrescu, возникли некоторые...

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

8
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 01:44 #2
Цитата Сообщение от mrKi Посмотреть сообщение
У меня же резальтут такой(скрин ниже)
А у меня такой (скрин). И зависание.
0
Миниатюры
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?  
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 01:48 #3
Цитата Сообщение от mrKi Посмотреть сообщение
Вот пример кода из книги.
Название книги и номер страницы с кодом выложите. Существует правлило трёх: http://ru.wikipedia.org/wiki/Правило_трёх_(C%2B%2B_программирование). Тут оно не выполняется, что странно для Шилдта.
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 01:55 #4
Цитата Сообщение от mrKi Посмотреть сообщение
Суть вопроса: в каких же случаях вызывается конструктор копирования
С.Прата.
0
Миниатюры
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?   В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?  
alsav22
5435 / 4830 / 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;
0
DrOffset
7517 / 4513 / 1024
Регистрация: 30.01.2014
Сообщений: 7,362
27.03.2014, 02:34 #6
mrKi, отсутствует реализация operator=. Он требуется в 49 строке.
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 11:37 #7
Нужно выполнить правило трёх.
Цитата Сообщение от mrKi Посмотреть сообщение
В книге результат(ниже приведенного кода) приводиться такой - 2 обычных конструктора + 1 конструктор копирования.
У меня же резальтут такой(скрин ниже)
Реализация другая. Вместо конструктора копирования, работает оператор присваивания, заданный по умолчанию.
0
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
27.03.2014, 14:35  [ТС] #8
alsav22, всё, я понял.
книга Шилдта, C++ Базовый курс. стр. 315-316
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2014, 15:21 #9
Цитата Сообщение от mrKi Посмотреть сообщение
Вот пример кода из книги.
Это про этот код?
0
Миниатюры
В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать?  
27.03.2014, 15:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 15:21
Привет! Вот еще темы с ответами:

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? - C++
class A { char * v; A(); ~A(); A(const A &amp;obj); } ///////////////////// A::A() {

В каких из приведенных ниже ситуаций может быть вызван конструктор копирования класса String: - C++
1. String spaces(size_t n) { const String s(n, ' '); return s; } int main() { std::cout &lt;&lt; spaces(10).str &lt;&lt;...

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

Объясните в каких случаях используеться char, а в каких string? - C++
Зачем(в каких случаях) использовать char, и char *... Зачем(в каких случаях) использовать string...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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