Скачиваний:
3
Добавлен:
20.05.2014
Размер:
411.65 Кб
Скачать

15.2 Доступ к элементам класса

В программе раздела 14.5 использовались обращения к элементам класса: к его данным и его функциям. Но такие обращения часто невозможны. Принцип инкапсуляции означает защиту своих элементов. Из него следует, что класс должен разрешить обращение к ним, если они нужны для других частей программы, т.е. извне.

По умолчанию полагается, что все элементы «работают» лишь внутри класса, т.е. взаимодействуют только друг с другом. Другими словами, собственные элементы локализованы в классе и недоступны извне. Но такие классы не нужны и поэтому все классы разрешают обращение к своим элементам – ко всем или к некоторым.

Чтобы разрешить обращение к элементу класса в его описании должно появиться служебное слово (модификатор) public, т.е. общедоступный, например,

public: int a; public: int a, float z;

public: float f ( float x, float y);

void display();

В начале класса , до появления служебного слова public, для элементов подразумевается слово private (собственный или скрытый). Это слово можно и не опускать, а записывать явно, например,

private: int k, char s; private: int fun( char m);

Рекомендуется в классе элементы public и private записывать группами, т.к. каждый из этих модификаторов действует в тексте класса до тех пор, пока не появиться следующий. Видим, что от описания типа модификатор отделяется двоеточием, т.е. его можно воспринимать как метку.

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

15.3 Вызов элементов класса

Пусть есть класс, стандартный или свой, и мы хотим в своей программе

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

Возможны различные способы вызова элемента класса для объявленного

объекта. Рассмотрим их с примерами из программы раздела 14.5 и другими, используя следующие сокращения: об – это имя объекта, ик – это имя класса.

  1. Вызов с полным именем элемента: об. ик :: элемент,

например, s . tabsin::N, s . tabsin::tab( ), z1.cоmplех :: real

  1. Вызов с уточнённым именем: об . элемент,

например, s . N , s . tab( ), z1.real

  1. Вызов с указателем на объект: указатель -> элемент,

например, tabsin * p; p= &s; p -> tab( ) ;

Здесь объявлен указатель p на объект s и для этого объекта

вызывается метод tab( ). Есть еще и другие способы.

15.4 Конструкторы классa

В программах на С++ при объявлении переменных, массивов, указателей можно присваивать им начальные значения, т.е. осуществлять инициализацию. Например,

int m=2; char name[5] = ”MIEM”; char nmas[4]= {‘M’, ‘I’, ‘E’, ‘M’};

Можно ли аналогичным образом в С++ при объявлении объектов некоторого класса осуществлять иx инициализацию? Очевидно, что простым способом нельзя, т.к. обычно объекты очень сложны и содержат множество элементов – данных. Но такая возможность очень удобна хотя бы для части данных и поэтому она есть в С++.

Реализуется такая инициализация с помощью конструкторов.

Конструктор – это особая функция, которая является элементом класса и имеет имя, совпадающее с именем класса.

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

Как и обычные функции классa, т.е. методы, конструктор имеет заголовок и аргументы. Если аргументов нет, то это конструктор по умолчанию.

Например, в примере раздела 13.2 (см. //10) работает конструктор :

string a ( p ) ;

При этом вызывается функция, заголовок которой имеет вид

string ( const char *u )

После заголовка , как обычно, присутствует тело функции в { . . . }, т.е. конструктора.

Это конструктор для новой строки, в которую он копирует строку, адресуемую указателем u, т.е. строку р, указанную при вызове. Хотя конструктор не возвращает никакого значения, но слово void перед его именем не нужно.Текст конструкторов может быть любым и в классе может быть несколько конструкторов, различающихся количеством или типом аргументов

(перегруженные функции, см. раздел 16.3).

Вызов конструктора происходит автоматически при объявлении, т.е. создании объекта, например, string s ( “ строка” ) ;

Здесь следует обратить внимание на вызов конструктора с конкретными параметрами: между именем конструктора и параметрами стоит имя объекта, т.е. конструктор имеет форму оператора описания с параметрами в скобках, а не вызова функции.

В разделе 6.4 “Работа с файлами” при открытии файлов применялись

конструкторы с параметрами, например,

ofstream fr2 (“ d:\\ Papka1\\ rez.txt” ) ;

| | |

Здесь имеем класс, объект, параметр.

В разделе 9.1 “Комплексные переменные” использовались конструкторы

класса complex, например, complex z2 ( 5 ); complex i ( 0, 1 ) ;

Если в классе не написаны конструкторы, то компилятор сам создаёт

функцию – конструктор класса. Конструктор без параметров называется

конструктором по умолчанию, например, объявление complex z ;

вызовет конструктор с заголовком complex ( )

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

Деструктор – это разрушитель объекта. Деструктор похож на конструктор, но в его заголовке перед именем класса ставится (без пробела) знак тильды ~ , например, он имеет заголовок

~ string ( void )

Обычно в текстах простых программ деструктора нет , т.к. он может создаваться автоматически.

Соседние файлы в папке Шпора по информатике