Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
float Student::addCourse( int hours , float grade )
{
float weightedGPA ;
weightedGPA = this -> semesterHours * this -> gpa ;
/* добавим новый курс */
this -> semesterHours += hours ;
weightedGPA += hours * grade ;
this -> gpa = weightedGPA / this -> semesterHours ;
return this -> gpa ;
}
Независимо от того, добавите ли вы оператор this -> в тело функции явно или нет, результат будет одинаков.
_________________
160 стр. Часть 3. Введение в классы
►Разрешение области видимости...161
Символ :: между именем класса и именем его члена называют оператором разрешения области видимости, поскольку он указывает, какой области видимости принадлежит член класса. Имя класса перед двоеточиями похоже на фамилию, тогда как название функции после двоеточия схоже с именем — такой порядок записи принят на востоке.
С помощью оператора :: можно также описать функцию — не член, использовав для этого пустое имя класса. В этом случае функция addCourse( ) должна быть описана как ::addCourse( int , float ) .
Обычно оператор :: не обязателен, однако в некоторых ситуациях это не так. Рассмотрим следующий фрагмент кода:
/* addCourse — перемножает количество часов и оценку */
float addCourse( int hours , float grade )
{
return hours * grade ;
}
class Student
{
public :
int semesterHours ;
float gpa ;
/* Добавить пройденный курс к записи */
float addCourse( int 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( int hours , float grade )
{
return hours*grade ;
}
_________________
161 стр. Глава 13. Работа с классами
class Student
{
public :
int semesterHours ;
float gpa ;
/* Добавить пройденный курс к записи */
float addCourse( int hours , float grade )
{
/* Вызвать внешнюю функцию */
weightedGPA = ::addCourse( semesterHours , gpa ) ;
/* Вызвать ту же функцию для подсчёта оценки с учётом нового курса */
weightedGPA += ::addCourse( hours , grade ) ;
gpa = weightedGPA / semesterHours ;
/* Вернуть новую оценку */
return gpa ;
}
} ;
Это похоже на то, как если бы я звал Стефана в собственном доме. Все решили бы, что я зову самого себя: ведь в моём доме, естественно, подразумевается фамилия Дэвис. Если же я имею в виду какого-то другого Стефана, то должен сказать "Стефан Спупендайк" или "Стефан Мак-Суини" либо использовать какую-нибудь другую фамилию. Так же действует и оператор разрешения области видимости.
«Расширенное имя функции включает в себя её аргументы. Теперь же мы добавляем к полному имени ещё и имя класса, к которому принадлежит функция.»
[ Помни! ]
►Определение функции-члена...162
Функция-член может быть определена как внутри класса, так и отдельно от него. Когда функция определяется внутри класса, это выглядит так, как в приведённом далее файле Savings.h :
/* Savings — определение класса с возможностью делать вклады */
class Savings
{
public :
/* Объявляем и определяем функции-члены */
float deposit( float amount )
{
balance += amount ;
return balance ;
}
unsigned int accountNumber ;
float balance ;
} ;
Использование такого заголовочного файла проще простого — его надо включить в программу и пользоваться определённым в нём классом, как вам заблагорассудится, например, как в приведённой далее программе SavingsClassInline .
_________________
162 стр. Часть 3. Введение в классы
/* SavingsClassInline — вызов фукции-члена, объявленной и определённой в классе Savings */
#include
#include
#include
using namespace std ;
#include " Savings.h "
int main( int nNumberofArgs , char* pszArgs[ ] )
{
/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */
setlocale (LC_ALL,".1251");
Savings s ;
s.accountNumber = 123456 ;
s.balance = 0.0 ;
/* Добавляем немного на счёт... */
cout << "Вкладываем на счёт 10 монет"
<< s.accountNumber << endl ;
s.deposit( 10 ) ;
cout << "Состояние счёта "
<< s.balance << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Так использовать класс Savings может теперь любой программист, которому доступен соответствующий заголовочный файл, причём ему совершенно не надо вдаваться в детали реализации этого класса.
«Директива#include заставляет препроцессор перед началом компиляции вставить вместо неё содержимое указанного в ней файла.»
[ Помни! ]
« Встраиваемые функции-члены
Функция-член, определённая непосредственно внутри класса, по умолчанию считается встраиваемой ( подставляемой,inline ) функцией ( если только не оговорено обратное, например с помощью опций командной строки компилятора ). Функции-члены, определённые в классе, по умолчанию считаютсяinline -функциями, потому что большинство функций-членов, определённых внутри класса, довольно малы, а такие маленькие функции являются главными кандидатами на подстановку. Тело встраиваемой функции подставляется компилятором непосредственно вместо оператора её вызова. Такая функция выполняется быстрее, поскольку от процессора не требуется осуществлять переход к телу функции. Однако при этом программы, использующие встроенные функции, занимают больше места, поскольку копии таких встраиваемых функций определяются один-единственный раз, а подставляются вместо каждого вызова.
Читать дальшеИнтервал:
Закладка: