Главная страница
Навигация по странице:

  • Конструкторы

  • Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы


    Скачать 1.76 Mb.
    НазваниеОбъекты и классы
    АнкорКурс ООП в С презентация
    Дата21.02.2022
    Размер1.76 Mb.
    Формат файлаppt
    Имя файлаООП в с++(полный курс).ppt
    ТипДокументы
    #368655
    страница5 из 26
    1   2   3   4   5   6   7   8   9   ...   26

    Конструкторы


    Последующее изменение значения строки приводит также и к изменению результата, возвращаемого функцией get_name(). Однако замещение адреса исходного элемента адресом строки *Names[1] не изменяет возвращаемого функцией значения:
    ASU-00-0
    ASU-92-1
    ASU-02-2
    ASU-92-1
    Причиной этого является то, что ссылка name лишь один раз связывается с объектом, на который первоначально указывал элемент Names[0]. Значение name не определяется при каждом обращении подобно разыменованию указателя (*Names[0]), почему изменение значения самого указателя и не дало предполагаемого результата.

    Конструкторы


    Конструктор копирования – это специальный вид конструктора, получающий в качестве единственного параметра указатель на объект этого же класса (Т — имя класса):
    Т::T(const T&)
    {
    ...
    /* тело конструктора */
    }
    Этот конструктор вызывается в тех случаях, когда новый объект создается путем копирования существующего:
      при описании нового объекта с инициализацией другим объектом;
      при передаче объекта в функцию по значению;
      при возврате объекта из функции.

      //копирующий конструктор, делаем новый объект по подобию исходного
      person::person(const person& orig)
      {
      name = new char[strlen(orig.name)+1];
      strcpy(name, orig.name);
      year = orig.year;
      }

    Конструкторы


    //копирующий конструктор, делаем новый объект по подобию исходного
    person::person(const person& orig)
    {
    name = new char[strlen(orig.name)+1];
    strcpy(name, orig.name);
    year = orig.year;
    }
    Если программист не указал ни одного конструктора копирования, компилятор создаст его автоматически. Такой конструктор выполняет поэлементное копирование полей. Если класс содержит указатели или ссылки, это, скорее всего, будет неправильным, поскольку и копия, и оригинал будут указывать на одну и ту же область памяти.

    Конструкторы


    #include "stdafx.h"
    #include "person.h"
    void print(person x) //объект передается по значению
    {
    cout << x.get_name() << " / " << x.get_age() << endl;
    }
    person set_info() //объект возвращается как значение функции
    {
    char s[20]; int y;
    person p;
    cout > s;
    p.set_name(s);
    cout > y;
    p.set_year(y);
    return p;
    }

    Конструкторы


    void main()
    { //вызов конструктора без параметров для создания объекта a:
    person a;
    //вызов конструктора с параметрами для создания объекта b:
    person b("Abram",1977);
    //вызов конструктора копирования для создания объекта c:
    person c = b;
    //вызов конструктора с параметрами для безымянного объекта
    //и вызов конструктора копирования для определения объекта d:
    person d = person("Gurgen",1942);
    //вызов конструктора без параметров для создания безымянного
    //объекта, размещаемому по адресу, хранящемуся в указателе pp1:
    person* pp1 = new person;
    //вызов конструктора с параметрами для создания безымянного
    //объекта, размещаемого по адресу, хранящемуся в указателе pp2:
    person* pp2 = new person("Ivan",1978);
    //вызов конструктора копирования для возврата значения функцией
    person e = set_info();
    //вызов конструктора копирования для создания объекта-параметра //функции:
    print(a); print(b); print(c); print(d);
    print(*pp1); print(*pp2); print(e);
    }

    Конструкторы


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


    Деструкторы

    Деструкторы


    Если создание объекта подразумевает выделение каких-либо ресурсов, то таким классам требуется функция, которая освободит ресурсы, выделяемые конструктором. Такая функция называется деструктором, она будет автоматически вызвана при уничтожении объекта.
    Деструктор не имеет параметров и возвращаемого значения. Вызов деструктора выполняется неявно, при уничтожении объекта класса.
    Если в классе деструктор не определен явно, то компилятор генерирует деструктор по умолчанию, который просто освобождает память, занятую данными объекта. В тех случаях, когда требуется выполнить освобождение ресурсов, выделенных конструктором, необходимо определить деструктор явно.
    Деструктор вызывается автоматически, когда объект удаляется из памяти:
      для локальных объектов это происходит при выходе из блока, в котором они объявлены;
      для глобальныхкак часть процедуры выхода из main;
      для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete.

      Имя деструктора начинается с тильды (), непосредственно за которой следует имя класса.
    1   2   3   4   5   6   7   8   9   ...   26


    написать администратору сайта