1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Вопросы новичков и не только", создана пользователем proahead, 23 сен 2011.

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

    proahead Гость

    Репутация:
    0
    Использую компилятор DEV C++ ( version 4.9.9.2)

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

    Вот этот листинг
    Код:
    #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

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Вот поверхностное копирование:
    Код:
    	int *a;
    int *b;
    a = new int;
    ...
    *a = 1;
    b = a;
    Вот глубинное:
    Код:
    	int *a;
    int *b;
    a = new int;
    b = new int;
    ...
    *a = 1;
    *b = *a;
     
Загрузка...
Статус темы:
Закрыта.

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