Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272
1

Конструктор копирования при инициализации

23.09.2015, 21:47. Показов 2929. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При инициализации одного объекта через другой вызывается конструктор копирования, под динамическую область памяти выделяется своя память.Вопрос такой алгоритм работы конструктора в этом случае:
1)Вызывает конструктор копирования и для динамической области выделяется своя область памяти.
2)Что же касается других данных они инициализируется значениями из кучи.
Я прав?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2015, 21:47
Ответы с готовыми решениями:

Конструктор копирования при инициализации в header файле
Добрый вечер, где можно почитать про данное поведение? #include <iostream> using namespace std; ...

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор...

Как написать конструкторы копирования, инициализации и конструктор без аргументов?
Как написать конструкторы копирования, инициализации и конструктор без аргументов? Вот код ...

Конструктор копирования, деструктор при наследовании
Есть класс A и производный от него B. Написать конструктор копирования, деструкторы для обоих...

6
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
23.09.2015, 22:06 2
Не особо понял этот поток сознания.
1) При инициализации объекта через my_class(bla-bla-bla), вызывается конструктор принимающий bla-bla-bla в качестве аргумента. В this ему подсовывается адрес памяти выделенной под объект. Откуда эта память взялась (динамическая память, стек, исчезли в соседней воинской части) - конструктор не колышет.
2) При инициализации объекта через new my_class(bla-bla-bla), вызывается operator new который рожает sizeof(my_class) свободной памяти. Как он ее родит - никого не колышет. Далее свободная память суется в this и смотри пункт 1.
3) Что означает "под динамическую область памяти выделяется своя память" я не знаю, но к вызову конструктора это никакого отношения не имеет.
0
-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272
23.09.2015, 22:13  [ТС] 3
Цитата Сообщение от Renji Посмотреть сообщение
Не особо понял этот поток сознания.
1) При инициализации объекта через my_class(bla-bla-bla), вызывается конструктор принимающий bla-bla-bla в качестве аргумента. В this ему подсовывается адрес памяти выделенной под объект. Откуда эта память взялась (динамическая память, стек, исчезли в соседней воинской части) - конструктор не колышет.
2) При инициализации объекта через new my_class(bla-bla-bla), вызывается operator new который рожает sizeof(my_class) свободной памяти. Как он ее родит - никого не колышет. Далее свободная память суется в this и смотри пункт 1.
3) Что означает "под динамическую область памяти выделяется своя память" я не знаю, но к вызову конструктора это никакого отношения не имеет.

Инициализируем объект через другой - вызывается конструктор копирования, если были в классе типы данных с выделением динамической памяти, то через конструктор копирования для временного объекта выделяется своя область памяти.А если, допустим у меня классе есть статические данные,то они при инициализации заполняются значениями из кучи?

То есть есть класс, в нем статические и динамические типы данных, инициалируем второй объект, через первый - вызывается конструктор копии, что с динамическим происходит данными - определено в конструкторе копии, с ними все ясно, а вот статические инициалируется значениями из кучи?понятен вопрос?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
23.09.2015, 22:41 4
Цитата Сообщение от artart96 Посмотреть сообщение
Инициализируем объект через другой - вызывается конструктор копирования, если были в классе типы данных с выделением динамической памяти, то через конструктор копирования для временного объекта выделяется своя область памяти.
Если мы говорим о конструкторе копирования по умолчанию, то он вызывает конструктор копирования для всех полей класса. Работают они с динамической памятью или нет - ему плевать.

Если мы говорим о пользовательском конструкторе копирования, то по умолчанию он инициализирует поля с помощью конструктора по умолчанию. Если такового нет - ищет у поля конструктор с аргументами и ругается "аргументы дай". Если и конструктора с аргументами нет - плюет и оставляет в поле класса рандомный мусор, появившийся там не пойми откуда. Сам он этот мусор не вносит, это до него лежало.
Цитата Сообщение от artart96 Посмотреть сообщение
А если, допустим у меня классе есть статические данные,то они при инициализации заполняются значениями из кучи?
Те статические данные которые static, никакого отношения к копированию не имеют. Потому как существуют в единственном экземпляре, независимо от того, сколько экземпляров класса вы наплодили.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.09.2015, 06:28 5
artart96, начнём с того, что, по сути, все поля класса изначально либо примитивные типы, которые копируются byte-to-byte, либо объекты, для которых вызывается конструктор копирования. То, что в классе может лежать указатель, ни на что не влияет, указатель сам по себе не означает динамически выделенный ресурс, это примитивный тип, который копируется побайтно. Он может указывать, например, на другое поле класса. Поэтому как распоряжаться с отдельными полями класса в конструкторе копирования, зависит только от программиста. Если указатель действительно указывает в кучу, вам нужно позаботиться об этом, выделив новую область памяти и скопировав туда значения из соответствующей памяти, принадлежащей копируемому объекту. Только надо помнить, что если вы заменяете дефолтный конструктор копирования, который по стандарту всегда есть в любом классе, на самописный, то все поля класса вам придётся инициализировать (копировать) вручную, иначе для них будет вызван конструктор по умолчанию (а за неимением оного вообще будет ошибка компиляции).
1
0 / 0 / 0
Регистрация: 17.01.2017
Сообщений: 4
18.05.2018, 22:28 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
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include<iostream>
 
class MyClass
{
public:
 
    MyClass(int size);
    ~MyClass();
    void Print(const int &size);;
    void FillTheArray(const int &size);
    MyClass(const MyClass &other);
    
 
    private:
        int* arr;
        int size;
};
 
MyClass::MyClass(int size)
{
    arr = new int[size];
    for (int i = 0; i < size; i++)
    {
        arr[i] = 0;
    }
    std::cout << "конструктор " << this <<" "<< this->arr << std::endl;
}
 
MyClass::~MyClass()
{
    delete[] arr;
    std::cout << "деструктор " << this << std::endl;
}
 
void MyClass::Print(const int &size)
{
    for (int i = 0; i < size; i++)
    {
        std::cout << arr[i] << "\t";
    }
    std::cout << std::endl;
}
 
void MyClass::FillTheArray(const int &size)
{
    std::cout << "Выбирите режим заполнения:" << std::endl;
    std::cout << "1 - автоматически, случайными числами." << std::endl;
    std::cout << "2 - вручную" << std::endl;
    int choiсe;
    std::cin >> choiсe;
    switch(choiсe)
    {
        case 1: 
            std::cout << "Выбирите максимально возможное число при заполнении:" << std::endl;
            int max;
            std::cin >> max;
            for (int i = 0; i < size; i++)
            {
                arr[i] = rand() % max;
            }
            break;
        case 2:
            for (int i = 0; i < size; i++)
            {
                std::cout << "[" << i << "]:";
                std::cin>>arr[i];
            }
            break;
        default:
            std::cout << "Error: неправильный ввод."<<std::endl;
            break;
    }
}
 
MyClass::MyClass(const MyClass &other)
{
    std::cout << "Вызвался конструктор копирования " << this <<" "<< other.arr << std::endl;
    this->size = other.size;
    this->arr = new int[this->size];
    for (int i = 0; i < other.size; i++)
    {
        this->arr[i] = other.arr[i];
    }
}
 
 
int main()
{
    setlocale(LC_ALL, "Rus");
    int size = 5;
    
    MyClass a(size);
    a.FillTheArray(size);
    a.Print(size);
    
    MyClass b(a);
    b.Print(size);
 
    std::cout << std::endl<<std::endl;
    return 0;
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
18.05.2018, 23:00 7
В конструкторе с размером внутренняя size не изменяется. Измените.
1
18.05.2018, 23:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2018, 23:00
Помогаю со студенческими работами здесь

Конструктор копирования при разбиении файлов
Здравствуйте. Не пойму как сделать конструктор копирования для класса. Имеется массив объектов...

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

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

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru