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

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

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

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

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

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

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

6
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.09.2015, 22:06
Не особо понял этот поток сознания.
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  [ТС]
Цитата Сообщение от 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
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.09.2015, 22:41
Цитата Сообщение от artart96 Посмотреть сообщение
Инициализируем объект через другой - вызывается конструктор копирования, если были в классе типы данных с выделением динамической памяти, то через конструктор копирования для временного объекта выделяется своя область памяти.
Если мы говорим о конструкторе копирования по умолчанию, то он вызывает конструктор копирования для всех полей класса. Работают они с динамической памятью или нет - ему плевать.

Если мы говорим о пользовательском конструкторе копирования, то по умолчанию он инициализирует поля с помощью конструктора по умолчанию. Если такового нет - ищет у поля конструктор с аргументами и ругается "аргументы дай". Если и конструктора с аргументами нет - плюет и оставляет в поле класса рандомный мусор, появившийся там не пойми откуда. Сам он этот мусор не вносит, это до него лежало.
Цитата Сообщение от artart96 Посмотреть сообщение
А если, допустим у меня классе есть статические данные,то они при инициализации заполняются значениями из кучи?
Те статические данные которые static, никакого отношения к копированию не имеют. Потому как существуют в единственном экземпляре, независимо от того, сколько экземпляров класса вы наплодили.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.09.2015, 06:28
artart96, начнём с того, что, по сути, все поля класса изначально либо примитивные типы, которые копируются byte-to-byte, либо объекты, для которых вызывается конструктор копирования. То, что в классе может лежать указатель, ни на что не влияет, указатель сам по себе не означает динамически выделенный ресурс, это примитивный тип, который копируется побайтно. Он может указывать, например, на другое поле класса. Поэтому как распоряжаться с отдельными полями класса в конструкторе копирования, зависит только от программиста. Если указатель действительно указывает в кучу, вам нужно позаботиться об этом, выделив новую область памяти и скопировав туда значения из соответствующей памяти, принадлежащей копируемому объекту. Только надо помнить, что если вы заменяете дефолтный конструктор копирования, который по стандарту всегда есть в любом классе, на самописный, то все поля класса вам придётся инициализировать (копировать) вручную, иначе для них будет вызван конструктор по умолчанию (а за неимением оного вообще будет ошибка компиляции).
1
0 / 0 / 0
Регистрация: 17.01.2017
Сообщений: 4
18.05.2018, 22:28
Во-во-во, близко к моей проблеме....
В конструкторе копирования никак не хочет выделяться динам. память вылетает прога и все (

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,886
18.05.2018, 23:00
В конструкторе с размером внутренняя size не изменяется. Измените.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2018, 23:00
Помогаю со студенческими работами здесь

Конструктор копирования, деструктор при наследовании
Есть класс A и производный от него B. Написать конструктор копирования, деструкторы для обоих классов. class A { public: int *a; ...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru