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

что делает copy constructor? - C++

Восстановить пароль Регистрация
 
Mar-12
 Аватар для Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 131
28.05.2013, 14:06     что делает copy constructor? #1
что делает copy constructor?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2013, 14:06     что делает copy constructor?
Посмотрите здесь:

C++ copy constructor operator=
this и Copy-Constructor C++
Copy-Constructor В Шаблонном Связном списке C++
C++ Deep copy and Shadow copy
C++ Copy Constructor Question .Generic inheritance. Templates
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
28.05.2013, 14:09     что делает copy constructor? #2
клонирует объект
Федя Форточкин
 Аватар для Федя Форточкин
66 / 80 / 16
Регистрация: 09.12.2012
Сообщений: 222
Записей в блоге: 3
28.05.2013, 14:09     что делает copy constructor? #3
Mar-12, копирует объект так как напишешь ты, например у тебя есть какой-то класс, если у тебя есть конструктор копирования, то при присваивании объекта этого класса будет вызываться именно этот конструктор, а если его нету, то просто будет присвоена побитовая копия объекта в правой части присваивания. сорри, не при операторе присваивания, вызывается отдельно
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
28.05.2013, 14:11     что делает copy constructor? #4
Инициализирует объект состоянием другого объекта такого же типа, т.е. по сути создает копию уже существующего объекта. Синтаксис обычно такого типа:
C++
1
2
3
4
SomeClass::SomeClass(const SomeClass& a):
 Data(a.Data)
 {
 }
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
28.05.2013, 14:12     что делает copy constructor? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Mar-12 Посмотреть сообщение
что делает copy constructor?
Предназначен для создания копии объекта, а что он на самом деле делает зависит полностью от Вас
Mar-12
 Аватар для Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 131
28.05.2013, 14:22  [ТС]     что делает copy constructor? #6
Croessmah, выдает exception,как понимаю дело в copy конструкторе,я не реализовала его,не знаю какой код написать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "Student.h"
 
 
Student::Student(void)
{
    name=new char[5];
    name="Tom";
    course=1;
}
Student::Student(char* nm,int c)
{
    name=nm;
    course=c;
}
Student::~Student(void)
{
    
    delete name;
}
C++
1
2
3
4
5
int _tmain(int argc, _TCHAR* argv[])
{
    Student s;  
    return 0;
}
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
28.05.2013, 14:33     что делает copy constructor? #7
copy тут ни при чем. Ошибка в конструкторе по умолчанию

C++
1
2
3
4
5
6
Student::Student(void)
{
    name=new char[5];
    std::strcpy(name,"Tom");
    course=1;
}
подключи
C++
1
#include <cstring>
Mar-12
 Аватар для Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 131
28.05.2013, 14:37  [ТС]     что делает copy constructor? #8
ITcrusader, а почему просто нельзя написать
C++
1
name="Tom"
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
28.05.2013, 14:55     что делает copy constructor? #9
Mar-12, потому что при этом выделяется память на стеке для хранения строки и адрес этого блока памяти присваивается указателю.
При этом выделенная посредством new память остается не освобожденной, брошенной, а попытка освобождения осуществляется над областью статической памяти, что недопустимо.

Т.е. используй delete только там, где было использовано new.

тот вариант, что я написал заполняет выделенную память строкой символов не приводя к переадресации указателя и описанным выше проблемам
Mar-12
 Аватар для Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 131
28.05.2013, 15:05  [ТС]     что делает copy constructor? #10
ITcrusader, и в этом тоже да ошибка?
C++
1
2
3
4
5
Student::Student(char* nm,int c)
{
    name=nm;
    course=c;
}
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.05.2013, 15:06     что делает copy constructor? #11
Как уже было сказано конструктор копировщик создан для копирования объектов.

Как и конструктор, деструктор по умолчанию, так же у тебя есть и конструктор копировщик по умолчанию, т.е. если ты его не задал, то он все равно есть, его задает компилятор.

Вот демонстрация ошибки конструктора копировщика по умолчанию, она возникает когда в качестве переменных класса используются указатели, в частности int *cena;

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class car
{
public:
car() { cena = new int; }
~car() { delete cena; }
 
void set(int x) { *cena = x; }
int get() { return *cena; }
 
 
private:
int *cena;
};
 
int main()
{
 
car vaz;
vaz.set(100);
 
std::cout << "cena vaza: " << vaz.get() << "\n";
 
car gaz(vaz);
gaz.set(150);
std::cout << "cena gaza: " << gaz.get() << "\n";
std::cout << "cena vaza: " << vaz.get() << "\n";
 
 
system("pause");
return 0;
}


В строчке 20 мы объявляем объект vaz, присваиваем ему цену в строчке 21, т.е. *cena объекта vaz получает ячейку в памяти, допустим ее адрес 00001, и по этому адресу располагается значение 100.
В строчке 25 мы объявляем новый объект - gaz и присваиваем ему все параметры объекта vaz, в частности цена vaz тоже составляет 100, в следующей строчке мы меняем цену на 150.
НО, по мимо цены gaz поменялась цена и vaz, она теперь составляет 150, почему так? потому что *cena объекта vaz и *cena объекта gaz находятся по одному адресу - 00001.
В итоге программа работает не правильно.

Что бы такого не было надо использовать собственный копировщик, вот он:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class car
{
public:
car() { cena = new int; }
~car() { delete cena; }
 
car(car &r) { cena = new int; *cena = r.get(); }
 
void set(int x) { *cena = x; }
int get() { return *cena; }
 
 
private:
int *cena;
};
 
int main()
{
 
car vaz;
vaz.set(100);
 
std::cout << "cena vaza: " << vaz.get() << "\n";
 
car gaz(vaz);
gaz.set(150);
std::cout << "cena gaza: " << gaz.get() << "\n";
std::cout << "cena vaza: " << vaz.get() << "\n";
 
 
system("pause");
return 0;
}


добавлен копировщик в строке 9, который при копировании выделяет для цены (*cena) нового объекта, отдельную ячейку в памяти.

т.е. теперь *cena объекта vaz располагается по адресу 00001, а *cena объекта gaz располагается по адресу 00002
Программа работает верно.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
28.05.2013, 15:06     что делает copy constructor? #12
да, нужно проводить различие между присвоением только лишь адреса и копированием содержимого памяти.
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
28.05.2013, 15:25     что делает copy constructor? #13
Лучше используйте вместо строк в стиле Си стандартные std::string
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Student
 {
 public:
 Student();
 Student(const std::string& nm, int c);
 Student(const Student& s);
 private:
 std::string name;
 int cource;
 };
Student::Student():
 name(""), cource(0)
 {
 }
Student::Student(const std::string nm, int c):
 name(nm), cource(c)
 {
 }
Student::Student(const Student& S):
 name(S.name), cource(S.cource)
 {
 }
И используйте семантику списка инициализации вместо присвоения в теле конструктора. Для типов типа int, char и bool это может еще и ничего, а вот для более сложных это чревато как минимум излишними накладными расходами, а то и вовсе ошибками компиляции.
Если член класса не инициализирован в списке инициализации, то еще до входа в тело конструктора вызывается его конструктор по умолчанию. Если таковой имеется, то это приводит к повторному присвоению в теле конструктора значения через operator= (а вовсе не через копирующий конструктор) этого члена; если же у него конструктора по умолчанию нет, то программа и не скомпилируется.
Mar-12
 Аватар для Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 131
28.05.2013, 16:24  [ТС]     что делает copy constructor? #14
ITcrusader,почему неправильно работает,а что с name?
C++
1
2
3
4
5
6
7
8
9
void Show(void)
    {
        cout<<name<<'\t'<<course<<endl;
    }
Student operator +(const int a)
    {
        this->course+=a;
        return *this;
    }
C++
1
2
3
Student s("Tom",2);
    s=s+10;
    s.Show();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2013, 16:33     что делает copy constructor?
Еще ссылки по теме:

C++ Что это за метод?И что он делает?
Объясните что именно делает "x%d, y%d: " или что это в даном коде C++
C++ Copy constructor

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

Или воспользуйтесь поиском по форуму:
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
28.05.2013, 16:33     что делает copy constructor? #15
Mar-12, name - это указатель. Выводится, вероятно, адрес памяти, на которую указывает он.
Было выше сказано, Гром об этом прогремел, указателями не стоит пользоваться на char, а пользоваться строками, они работают не медленнее. Если хочешь освоить работу с указателями, воспользуйся другим контекстом.
Yandex
Объявления
28.05.2013, 16:33     что делает copy constructor?
Ответ Создать тему
Опции темы

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