Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bilety_programmirovanie_1-7.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.4 Mб
Скачать

31. Операторы управления областью видимости.

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

Для начала обратите внимание на символ : : его используют между именем класса и именем его члена, а называют его оператором разрешения области видимости. Так же оператор :: используют для описания функции, где имя класса будет пустым.

addCourse () \\ дана функция

: :addCourse(int, float) \\ а вот так функция описана

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

float addCourse (in hours, float grade)

{

return hours*grade;

}

class student

{

public:

int semesterhours;

float gpa;

// добавить пройденный курс к записи

float addCourse (in hours, float grade)

<

//вызвать внешнюю функцию

weightedGPA=addCourse(semesterhours, gpa);

// вызвать ту же функцию для подсчета оценки с учетом нового курса

weightedGPA+=addcourse (hours, grade);

gpa= weightedGPA / semesterhours;

//вернуть новую оценку

return gpa;

}

}

В данном примере я хочу, чтобы функция-член student: : addCourse () вызывала функцию – не член :: addCourse (). Без оператора :: вызов функции addCourse () внутри класса student приведет к вызову функции student::addCourse ().

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

//addCourse - функция перемножает кол-во часов и оценку

float addCourse (in hours, float grade)

{

return hours*grade;

}

class student

{

public:

int semesterHours;

flaot gpa;

//добавить прйденный курс к записи

float addCourse (int hours, float grade)

{

//вызвать внешнюю функцию

weightedGPA = ::addCourse (semesterHours, gpa);

//вызвать ту же функцию для подсчёта оценки с новым курсом

weightesGPA+=::addCourse(hours, grade);

gpa=weightesGPA/semesterHours;

//вернуть новую оценку

return gpa;

}

}

Определение функции-члена

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

class student

{

public:

int semesterHours;

flaot gpa;

//добавить прйденный курс к записи

float addCourse (int hours, float grade)

{

//Подчитаем суммарное время курсов с учётом среднего бала

float weightGPA;

weightedGPA = semesterHours * gpa;

//добавляем новый курс

semesterHours += hours;

weightedGPA+=grade * hours;

gpa = weightedGPA/semesterHours;

//вернуть новую оценку

return gpa;

}

}

А теперь давайте погорим подробно об определении функции-члена вне класса. Как правило, которое выявлено на практике многими программистами, для больших функций встраивание тела функции может привести к созданию очень больших и неразборчивых определений классов. Во избежание этого, C++ предоставляет возможность определять тела функции-члена вне класса.

class Student

{

public:

int semesterHours;

float; gpa;

//добавить пройденный курс к записи

float addCourse(int hours, float grade)

};

//Добавление информации о пройденом курсе к полям класса Student

float Student::addCourse(int hours, float grade)

{

float weightedGPA;

weightedGPA=semesterHours *gpa;

//Добавление нового курса

semesterHours+=hours;

weightedGPA+=grade * hours;

gpa=weightedGPA/semesterHours;

return gpa;

}

Самое интересное, что теперь объявление класса содержит только прототип функции addCourse (), а сама функция прописана в другом файле.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]