Функции, объявленные внутри структуры, называются функции-члены и могут вызываться только для работы с определенными переменными с использованием синтаксиса для доступа к элементам структуры:
struct date today; struct date my birthday;
my birthday. set (10, 2, 1989); today. set (16, 2, 2007); today. next ();
today. day =5; обращение объекта today к элементу day.
Поскольку разные структуры могут иметь функции-члены с одинаковыми именами, при определении функции-члена необходимо указывать имя структуры:
void date:: print (void)
{
cout<<day<<month<<year;
}
и определение функции:
date:: – принадлежность функции print к структуре date.
В функции-члене имена элементов структуры могут указываться без явной ссылки на объект. В этом случае имя относится к элементу того объекта, для которого функция была вызвана:
today. print();– вызов функции.
Функции не являются единственными для доступа к элементам структуры day. Это ограничение можно наложить, если объявить структуру как класс.
Пример: class date
{
private:
int day, month, year; public:
void set (int, int, int); void next (void); void print (void);
};
6
Объявлен новый тип данных: класс day. Класс может содержать закрытую (private) и общую (public) часть. По умолчанию все элементы класса закрытые. Поэтому ключевое слово private в данном примере можно убрать.
Закрытые элементы класса не могут использоваться никакими функциями, кроме функции-члена класса.
Открытая часть – это переменные и функции, доступные для всех других функций программы и объявленные после ключевого слова public. Открытая часть представляет интерфейс к объекту класса.
Как правило, большинство данных в классе являются закрытыми, доступ к ним осуществляется при помощи открытых функций.
Защищенный режим доступа protected используется при наследовании класса.
Ключевые слова: private, public, protected могут встречаться в шаблоне класса в любом порядке, любое количество раз, однако хорошим стилем программирования считается описание один раз.
После создания класса можно объявить объект этого класса: date dat1, dat2;
где date – имя класса; dat1, dat2 – имена объектов. Таким образом, создано два объекта класса day.
1.2. Описание и вызов функций-членов класса
Описание функции-члена класса осуществляется при помощи операции принадлежности :: , которая определяет, к какому классу относится эта функция:
void date:: print (void)
{
cout<<day<<month<<year;
}
void date:: set (int a, int b, int c)
{
day=a; month=b; year=c;
}
Имя date::print называется полным или квалифицированным именем функции-члена класса. Чтобы вызвать функцию-член класса необходимо использовать имя объекта и операцию (.).
7
dat1. print ();
dat2. set (2, 2, 2002);
Следует помнить, что dat1 и dat2 – два разных объекта одного класса, при этом элементы, т. е. данные этих объектов занимают в памяти разное место, однако, функции членов класса – общие, потому что функция-член класса может вызывать другую функцию-член того же класса или использовать элементы (данные класса) непосредственно. Точка используется только тогда, когда функция-член вызывается извне класса.
На практике объявление класса (создание шаблона) и описание функ- ций-членов, как правило, осуществляется до main, так как не требует выделения памяти.
Класс – это не объектные переменные, а типы (шаблоны) для создания объектов.
Общий вид шаблона класса: Class имя класса {
private:
-||-||-||- protected:
-||-||-||- public:
-||-||-||-
};
При объявлении класса используются прототипы функции-члена класса. После описания класса можно объявить несколько объектов класса в качестве экземпляра этого класса:
date dat1,dat2;
Для доступа к элементам класса можно использовать три способа указания имени объекта.
1.Указание полного (квалифицированного) имени функции: dat1.date::print();
2.Непосредственное указание имени объекта и (.): dat1.print();
Второй вариант записи возможен в случае однозначности определения принадлежности функции print к классу dat.
8
Если имеются функции-члены с одинаковыми именами, определенные в разных классах, необходимо использовать полное (квалифицированное) имя функции-члена класса.
3. Через указатель: date *s;
*s = &dat1; s->print();
Пример: создать класс, реализующий сумму двух целых чисел.
# include <iostream.h> class sum
{
int x,y,z;
public: void get xy (int x1, int y1); void summa (void);
};
void sum :: get xy (int x1, int y1) { x=x1; y=y1;}
void sum :: summa (void) {z= x+y;}
void main()
{
sumz;
intx2=y2;
cout<<”Введите первое слагаемое: \n”; cin>>x2;
cout<<”Введите второе слагаемое: \n”; cin>>y2;
z. get xy (x2,y2); z. summa();
}
2. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ
Для большинства объектов естественно требовать, чтобы они были инициализированы до начала их использования. В C++ автоматическая инициализация реализуется использованием функции, называемой конструктором.
9
Конструктор – специальная функция, являющаяся членом класса и имеющая то же имя, что и класс. Для конструктора не указывается тип возвращаемого значения (даже void недопустим).
Пример:
# include <iostream.h> class sum
{
int x, y, z;
public: sum (int x1; int y1); void summa (void);
};
sum:: sum (int x1=0, int y1) { x=x1; y=y1; }
void sum:: summa (void) { z= x+y; }
void main ()
{
int x2; y2;
cout<<”Введите первое слагаемое: \n”; cin>>x2;
cout<<”Введите второе слагаемое: \n”; cin>>y2;
sum.z (x2, y2); z.summa ();
}
Конструктор может иметь параметры со значением по умолчанию. Если функция конструктор требует параметры, то в момент создания объекта они должны быть обязательно переданы. Функция конструктор вызывается в момент создания объекта: если объект локальный, то при входе в блок, если глобальный – один раз при создании объекта в начале программы. Функцию конструктор нельзя вызвать явно. Конструктор может быть перегруженной функцией, т. е. один класс может иметь несколько конструкторов для разных типов или количества данных. Для передачи значений элементам данных объекта с помощью конструктора существует два формата записи:
1. Имя класса_ имя объекта = имя конструктора (список аргументов): sumz = sum(5,7);
10