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

Тема в разделе "C/C++/C#", создана пользователем proahead, 23 сен 2011.

Статус темы:
Закрыта.
  1. proahead

    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. И какой-нибудь практикум, а то я не смогу выучить этот язык((
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Вот поверхностное копирование:
    Код (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;
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей