Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 12 Классы_Объекты_Массивы объектов 2015.doc
Скачиваний:
65
Добавлен:
29.02.2016
Размер:
110.59 Кб
Скачать

Определение функций класса

Функции класса определяются как обычные функции. Но для того чтобы показать, что эти функции принадлежат классу, нужно перед именем функции записать имя класса и операцию разрешения области видимости (::). Данная операция указывает, какой области видимости (т.е. какому классу) принадлежит функция. После заголовка функции располагается тело функции в фигурных скобках. Например, определим функции 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.