Конструктор класса. Виды конструкторов. Синтаксис. Пример.



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

Различают также конструктор инициализации (обычный конструктор с параметрами) и конструктор копирования (конструктор в который передается уже существующий объект). Конструктор инициализации может объявляться только программистом, а конструктор копирования может создаваться компилятором автоматически, и он будет выполнять простую побитовую копию переданного объекта, что плохо, когда в классе есть внутренние указатели. Поэтому в таких случаях надо определять конструктор копирования самому: class myclass {public: myclass (myclass& a) {}};

Если в классе имеется конструктор инициализации, у которого значения всех параметров заданы по умолчанию, то при вызове конструктора по умолчанию, будет неявно вызываться именно этот конструктор инициализации. Чтобы запретить это, надо перед соответствующим конструктором инициализации добавить классификатор explicit: explicit X(int k =0) {}.

Если внутри класса используются константы или статические элементы, то можно предусмотреть инициализатор переменных, который следует после имени конструктора: class myclass { int A; public: const int MaxA; const int MinA; myclass(int min):MaxA(10), MinA(min) {}};

При наследовании во время создания объекта производного класса конструкторы будут вызываться в следующем порядке: конструктор базового класса, конструктор производного класса. При этом у базового класса будет вызван конструктор по умолчанию. Для того чтобы вызвать конструктор базового класса с параметрами и тем самым передать ему эти параметры необходимо при объявлении конструктора производного класса использовать следующую конструкцию: конструктор_произв_класса (список_парам): конструктор_баз_класса (список_парам) {//тело конструктора производного класса}.

Друзья класса. Дружественные функции и классы. Правила относительно друзей. Пример.

Дружественная функция – функция, которая не является членом класса, но имеет доступ к его закрытым членам. Для того, чтобы указать что функция является другом класса, надо добавить в класс сигнатуру этой функции с модификатором friend: class myclass {int n; public: friend int factor();}; int factor() {myclass obj; obj.n = 100;}. Из примера видно, что функция может получить доступ к внутренним члена класса только через конкретный объект класса.

Правила: дружественная функция не член класса, т.е. она не может вызываться через имя объекта; дружественная функция не наследуется; функция может быть дружественной по отношению к нескольким классам; функция может быть членом одного класса и дружественной к другому классу: class A {public: int myfunc();}; class B {public: friend int A::myfunc();};

Преимущества: используется для перегрузки левосторонних операторов (кроме оператора присваивания) и операторов ввода-вывода; помогает получить доступ к закрытым членам нескольких классов.

Оператор присваивания. Назначение. Синтаксис. Пример.

Относительно класса можно перегружать оператор присваивания. По умолчанию, если оператор присваивания применяется по отношению к объекту, то происходит поразрядное копирование объекта стоящего справа и его присваивание объекту стоящему слева. Однако бывают случаи когда точное копирование нежелательно. Тогда оператор надо перегружать: class strtype {public: strtype& operator= (strtype& obj) {… return *this}}

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


Дата добавления: 2018-04-15; просмотров: 464; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!