- •Глава 12. Классы и объекты. Массивы объектов.
- •Определение класса, объекта
- •Спецификаторы доступа к членам класса
- •Определение функций класса
- •Создание объектов, доступ к членам класса
- •Локальные и глобальные объекты
- •Присваивание объектов
- •Конструкторы и деструкторы
- •Конструкторы с параметрами
- •Конструкторы по умолчанию
- •Перегрузка конструкторов
- •Массивы объектов
Определение функций класса
Функции класса определяются как обычные функции. Но для того чтобы показать, что эти функции принадлежат классу, нужно перед именем функции записать имя класса и операцию разрешения области видимости (::). Данная операция указывает, какой области видимости (т.е. какому классу) принадлежит функция. После заголовка функции располагается тело функции в фигурных скобках. Например, определим функции set() и get() класса Samp следующим образом:
Samp::set(int n){a = n;} // установка переменной a
int Samp::get(){ // чтение переменной a
return a;
}
Функции класса также могут быть определены внутри определения класса. В этом случае они считаются inline-функциями.
Функции класса можно перегружать, но только с помощью других функций класса. При этом следует просто обеспечить в определении класса прототип для каждой версии перегруженной функции, и каждую версию функции обеспечить отдельным определением.
Создание объектов, доступ к членам класса
Определение класса только задаёт формат объекта, но не создаёт ни одного объекта, т.е. память под объект не выделяется. Для создания объектов необходимо использовать оператор объявления, в котором указать имя класса и перечислить через запятую имена объектов, которые будут относиться к данному классу. Например, оператор
Samp ob1, ob2;
создаёт объекты ob1 и ob2 класса Samp.
Все объекты класса имеет общие функции, но каждый объект класса
создаёт и поддерживает свои собственные данные.
После создания объекта может возникнуть необходимость в получении доступа к его отдельным элементам. Доступ к открытым данным можно получить напрямую, используя операцию точка (.), например, ob1.b = 1; ob2.b = 2; ob1.set(); или через указатель на этот объект, используя операцию стрелка (–>), например, ob1–>b = 1; ob1->set();
Операторы же вида
ob1.a = 5; ob2.a = 9;
приводят к возникновению ошибок компиляции, так как a – закрытая переменная класса и к ней нет прямого доступа. Доступом к закрытым данным можно эффективно управлять с помощью открытых функций класса, называемых функциями доступа. Обычно эти функции называют set() и get(), хотя это и необязательно. Например, изменить закрытые данные класс может позволить своим пользователям с помощью функции доступа set() следующим образом:
ob1.set(5); ob2.set(9); // ob1.a = 9 ob2.a = 5
Если класс хочет позволить читать закрытую переменную класса a, он может обеспечить это с помощью функции чтения get(), например:
ob1.get(); ob2.get(); // чтение переменной a объектов ob1и ob2
// Пример 12.1. Определение класса. Создание и использование
// объектов. Доступ к членам класса.
#include <iostream>
using namespace std;
class Samp{ // определение класса Samp
int a; // private-переменная a
public: // public-члены
int b;
void setab(int n); // функция setab()
int geta(){return a;} // функция geta()
};
void Samp::setab(int n){ // определение фукции setab()
a = n; b = n * n; // прямой доступ к a и b
// int b = 999; // локальная переменная b
// cout<<"b-localnaya "<<b<<endl;
// cout<<"b-member class "<<Samp::b<<endl;
}
int main(){
Samp ob; // объект ob типа Samp
ob.setab(5); // установка a и b
cout<<ob.geta()<<' '<<ob.b<<endl; // a = 5 b = 25
ob.b = 55; // прямой доступ к b
cout<<ob.geta()<<' '<<ob.b<<endl; // a =5 b = 55
}
Переменные, определённые в функции класса, имеют область видимости функцию (они известны только этой функции). Если функция класса определяет переменную с тем же именем, что и у переменной, определённой в классе, последняя делается невидимой в функции. Такая скрытая переменная может быть доступна посредством операции разрешения области видимости (::), например, как в нашем примере – Samp::b.