• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Конструктор копировщик, глубинное и поверхностное копирование

  • Автор темы proahead
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

proahead

Использую компилятор DEV C++ ( version 4.9.9.2)

Читал книгу Джесса Либерти С++ за 21 день. Пытался разобраться в листинге, который был посвящен конструктору копировщику.

Вот этот листинг
C++:
#include <cstdlib>
#include <iostream>
using namespace std;


class Cat {
public:
Cat();
Cat(const Cat &);
~Cat();
int GetAge() const {return *itsAge; }
int GetWeight() const { return *itsWeight; }
void SetAge(int age) { *itsAge=age; }

void Address() {cout<<"Adrees "<<&itsAge<<"\n\n";} 
private:
int * itsAge;
int *itsWeight;
};


Cat :: Cat()
{
itsAge=new int;
itsWeight=new int;

*itsAge=5;
*itsWeight=10;
}

Cat :: Cat (const Cat & rhs)
{
itsAge=new int;
itsWeight=new int;
*itsAge=rhs.GetAge();
*itsWeight=*(rhs.itsWeight);
}

Cat :: ~Cat()
{
delete itsAge;
itsAge=0;
delete itsWeight;
itsWeight=0;
}



int main()
{
Cat frisky;

cout<<"frisky's age "<<frisky.GetAge()<<endl;
cout<<"Setting frisky to 6 ... \n";


frisky.SetAge(6);
cout<<"creating boots from frisky...\n";

Cat boots(frisky);

cout<<"frisky's age "<<frisky.GetAge()<<"\n";
frisky.Address();
cout<<"boots' age "<<boots.GetAge()<<"\n";
boots.Address();


frisky.SetAge(7);

cout<<"fisky's age "<<frisky.GetAge()<<"\n";
cout<<"boot's age "<<boots.GetAge()<<"\n";

system("PAUSE");
return EXIT_SUCCESS;
}
Это пример так называемого глубинного копирования, выполняемого конструктором копировщиком при котором он размещает переменные члены создаваемого им объекта в адресах отличных от адресов переменных-членов с которых выполнялось копирование.


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

Я пытался посмотреть, как же это все таки может быть и ничего не получилось. Поэтому прошу вас ответить на вопросы.

1. Как мне изменить эту программу, чтобы адреса переменных-членов созданного копированием объекта и того объекта с которого выполнялось копирование совпадали, т.е. было выполненное поверхностное копирование?
2. Посоветуйте пожалуйста хорошую книгу по C++ где бы изложение было последовательным и насколько позволяет изложение в книги полным.
3. И какой-нибудь практикум, а то я не смогу выучить этот язык((
 
L

lazybiz

Вот поверхностное копирование:
C++:
	int *a;
int *b;
a = new int;
...
*a = 1;
b = a;

Вот глубинное:
C++:
	int *a;
int *b;
a = new int;
b = new int;
...
*a = 1;
*b = *a;
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!