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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.71
AnreyKazakov
Заблокирован
#1

Что такое конструктор копий? - C++

02.10.2012, 00:13. Просмотров 3291. Ответов 22
Метки нет (Все метки)

Объясните, пожалуйста, на максимально простом языке, чем отличается конструктор от конструктора копий?
Может это и одно и то же, хотя вряд ли, в книжке в разных разделах инфа выложена...
под конструктором я понимаю что-то вроде:
C++
1
2
3
4
class as{
as():a(155){}
int a;
};
Если класс объявлен, а переменная а не инициализирована, то значение а 155.
А что такое конструктор копий? Злость берет, что нифига не понимаю.... Единственное порадовало: "Зачастую самой трудной задачей при определении конструктора копий является собственно осознание того,что он необходим"
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2012, 00:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Что такое конструктор копий? (C++):

Что такое конструктор? - C++
Конструктор - это такие детали , как map , player, enemy.Я правильно понял?

что такое конструктор? - C++
Обьясните плиз что такое конструктор? Это функция а что она делает и для чего?

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

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

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

Что такое конструктор по умолчанию? Как инициализируются данные-члены объекта? - C++
Что такое конструктор по умолчанию? Как инициализируются элементы данных объекта, если класс имеет только неявно определенный...

22
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2012, 20:55 #16
Если в вашем коде, из 12 поста, определить деструктор:
C++
1
2
3
4
~vertu()
{
     delete str;
}
, то результат работы будет уже такой:
1
Миниатюры
Что такое конструктор копий?  
AnreyKazakov
Заблокирован
02.10.2012, 20:58  [ТС] #17
Чуть начинаю догонять .... это хорошо особенно выражение понравилось "повреждение кучи"
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2012, 21:19 #18
Кстати, в вашем коде из 12 поста, вообще не работает конструктор копирования. Там не понятно, что работает, из-за того, что объект содержит указатель, на строковую лексему в статической памяти. Чтобы нормально всё работало, нужно так переписать:
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
#include <string>
#include <iostream>
using namespace std;
 
class vertu
{
    public:
     vertu() : ival(0), str(new string)
     {}
     
     vertu(const vertu &copy) 
     {
        ival = copy.ival;
        str = new string;
        *str = *copy.str;
    }
     
     int ival;
     string* str;
     
     void operator()(int a, string* s)
     {
        ival = a;
        str = new string;
        *str = *s;
     } 
    
    ~vertu()
    {
        delete str;
    }  
};
 
int main()
{
    vertu vert;
    int k(10);
    string sk("Papapap");
    
    vert(k, &sk);
    cout << vert.ival << " " << *vert.str << endl;
    
    vertu vert2(vert);
    cout << vert2.ival << " " << *vert2.str << endl;
 
    cin.get();
    return 0;
 }
1
AnreyKazakov
Заблокирован
02.10.2012, 21:27  [ТС] #19
Цитата Сообщение от alsav22 Посмотреть сообщение
ival = copy.ival;
str = new std::string;
*str = *(copy.str);
Во, спасибо, а я все гадал как это можно сделать, оказывается просто через ; ....
0
Sher_vud
4 / 4 / 1
Регистрация: 25.09.2012
Сообщений: 42
02.10.2012, 22:40 #20
Цитата Сообщение от alsav22 Посмотреть сообщение
В вашем коде он и не дожен был вызываться
спасибо, понял не сразу как все работает

Цитата Сообщение от John Prick Посмотреть сообщение
если в классе объявлен копирующий конструктор, то копирующего конструктора по умолчанию в нём уже нет
а вот это стало новостью для меня, спасибо

остался небольшой вопрос по листингу, который привел в 4-м посте
почему же появляются ошибки, если отсутствует идентификатор "const"

C++
1
2
3
4
5
6
              String(const String &T)            //если не проставить "const" компилятор выдает ошибку
                     {                                 // при этом в исходном примере const  не стоит 
                     cout << "\nkopirovanie\n";
                     ptr = T.ptr;
                     (ptr -> count)++;
                     }
0
ForEveR
В астрале
Эксперт С++
7993 / 4752 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
02.10.2012, 23:23 #21
Sher_vud, Потому что

C++
1
String s = "abcd";
эквивалентно на самом деле
C++
1
String s(String("abcd"));
, компилятор может не вызывать конструктор копирования, однако проверить то, что существует подходящий обязан. В данном примере проблема в том, что конструирование идет от временного объекта, который не может быть связан с ссылкой. Почитайте http://stackoverflow.com/questions/1...t-initializati
1
Sher_vud
4 / 4 / 1
Регистрация: 25.09.2012
Сообщений: 42
03.10.2012, 01:06 #22
Цитата Сообщение от ForEveR Посмотреть сообщение
В данном примере проблема в том, что конструирование идет от временного объекта
C++
1
String s = "abcd";
в статье на которую Вы дали ссылку приводится пример
B(A const&)
operator B(A&);
я так понял "const" должен быть проставлен для повышения приоритета, дабы исключить сомнения у компилятора, что же запускать.
получается проблема в том,что компилятор считает ситуацию
B(A&)
operator B(A&);
неоднозначной и соответственно выдает ошибку, я правильно понимаю?
у меня он пишет вот что:
no matching function for call to `String::String(String)'
candidates are: String::String(String&)
String::String(char*)
0
ForEveR
В астрале
Эксперт С++
7993 / 4752 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
03.10.2012, 07:17 #23
Sher_vud, У вас проблема исключительно в том, что временный объект не может быть связан с неконстантной ссылкой.
0
03.10.2012, 07:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2012, 07:17
Привет! Вот еще темы с ответами:

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

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

Конструктор копий. Оператор присваивания - C++
В классе есть массив char (не динамический) размером 40 байт. Вопрос1: нужно ли для такого класса определять конструктор копий или...

Перегрузка оператора ++ , деструктор и конструктор копий - C++
Привет всем! В продолжение Этой темы появились новые вопросы и непонятки. Буду признателен за советы и разъяснения ;) Начну с...


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

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

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