Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
19-22,37.docx
Скачиваний:
7
Добавлен:
21.09.2019
Размер:
44.88 Кб
Скачать

Void out(void){ puts(p); }

}

Void main(){

demo a("Ok"), b(a);

a.out(); b.out();

}Вместе с конструктором умолчания, конструктор копирования входит в обязательный набор конструкторов для любого класса. Реализация механизма копирования значений для транслятора не является неразрешимой задачей. Конструктор копирования всего лишь создаёт копии объектов. Этот процесс реализуется при помощи стандартного программного кода. И построить такой код транслятор способен самостоятельно. Здесь и далее, в примерах нами будет применяться операция присвоения = . В определённом смысле эта операция подобна конструктору. Реализующий эту операцию код автоматически создаётся на этапе трансляции для любого класса. Как и генерация кода стандартных конструкторов, это не самая сложная задача.

Чтобы восстановить структуру заголовка конструктора копирования, мы должны лишь определить тип его параметра. На первый взгляд, здесь всё просто. В качестве значения параметра конструктору передаётся имя объекта, значит можно предположить, что тип параметра конструктора копирования соответствует данному классу. Однако это не так. И вот почему. В C++ конструктор копирования является единственным средством создания копий объекта. На самом деле, в конструкторе копирования класса X в качестве параметра используется ссылка на объект этого класса. Причём эта ссылка объявляется со спецификатором const. Как известно, выражение вызова функции с параметром типа X ничем не отличается от выражения вызова функции, у которой параметром является ссылка на объект типа X. При вызове такой функции не приходится копировать объекты как параметры. Передача адреса не требует копирования объекта, а значит, при этом не будет и рекурсии.

Конструктор копирования - обязательный элемент любого класса. Он также может быть переопределён подобно конструктору умолчания. Спецификатор const (конструктор копирования работает с адресом объекта) предохраняет объект-параметр от случайной модификации в теле конструктора

Операторы new и delete предназначены для динамического распределения памяти и могут использоваться в С++ - программах вместо функций malloc() и free().

Оператор new имеет два допустимых формата вызова:

[::] new [список_аргументов] тип [инициализатор]

[::] new [список_аргументов] (тип) [инициализатор]

тип - это тип данных, для которых необходимо зарезервировать память.

инициализатор - значение, используемое для инициализации данных в памяти.

Пример использования оператора new:

double *p,*p2,*p3,*p4;

p=new double;

p2=new double(1.2);

p3=new double[1];

p4=new double[1](3.14); // некорректно, массивы не могут

//инициализироваться по new

Объекты, созданные с помощью new, имеют неограниченное время жизни. Поэтому область памяти должна освобождаться оператором delete. При создании объекта происходит каскадный вызов конструкторов по иерархии классов - сначала базовых, а затем производных. Оператор delete предназначен для освобождения динамически выделенной (посредством оператора new) памяти:delete p; delete[] p3;

Для удаления элементов классов вызывается деструктор. В некоторых реализациях языка вызов оператора delete для несуществующего или пустого указателя приводит к возникновению исключения.

37. Пространство имен. Пример. (конспект лекций);

Пространство имен является механизмом отражения логического группирования. Если некоторые объявления можно объединить по какому-то критерию, то их можно поместить в одно пространство имен для отражения этого факта.

namespace Space {

         int NumberOfStar() {}

         int DistanceFromSunny() {}

}

Наиболее распространенным является использование пространства имен std для подключения стандартной библиотеки STL. Использование пространства имен позволяет структурировать сложные проекты, разбивая его на логические части.

Иногда полезно отделить описание функции в некотором пространстве имен от его реализации.

namespace Space {

         int NumberOfStar();

         int DistanceFromSunny();

}

int Space::NumberOfStar() {}

int Space::DistanceFromSunny() {}

Пространство имен является областью видимости. Если имя довольно часто используется вне своего пространства имен, то бывает утомительным писать полное имя функции или переменной. Эту многословность можно устранить, используя using-объявления или using-директивы.

using-объявления позволяют сократить название конкретной функции или переменной.

using Space::NumberOfStar;

int k=NumberOfStar();

using-директивы сокращают сразу все имена из пространства имен.

using namespace Space;

int k=DistanceFromSunny();

Особенно полезно использовать пространство имен при совместной работе нескольких разработчиков. Например, два разработчика могли создать два файла, в каждом из которых описаны функции с одинаковым интерфейсом. Тогда, для того чтобы объединить эти файлы в один проект, требуются большие усилия по переименованию функций и переменных. Заключение каждого файла в свое пространство имен и использование using директив (или using-объявлений) значительно упростит процесс объединения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]