Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Есть ещё одна техническая причина, по которой функции-члены класса лучше делать встраиваемыми. Как вы помните, все структуры языка С обычно определяются в составе включаемых файлов с последующим использованием в исходных.срр -файлах при необходимости. Такие включаемые файлы не должны содержать данных или тел функций, поскольку могут быть скомпилированы несколько раз. Использование же подставляемых функций во включаемых файлах вполне допустимо, поскольку их тела, как и макросы, подставляются вместо вызова в исходном файле. То же относится и к классам С++. Подразумевая, что функции-члены, определённые в описании классов, встраиваемые, мы избегаем упомянутой проблемы многократной компиляции.»
[ Технические подробности ]
_________________
163 стр. Глава 13. Работа с классами
►Определение функций-членов вне класса...164
Для больших функций встраивание тела функции непосредственно в определение класса может привести к созданию очень больших и неудобочитаемых определений классов. Чтобы избежать этого, С++ предоставляет возможность определять тела функций-членов вне класса.
В этом случае в заголовочном файле имеется только объявление, но не определение функции.
/* Savings — определение класса с */
/* возможностью делать вклады */
class Savings
{
public :
/* Объявляем, но не определяем функции-члены */
float deposit( float amount ) ;
unsigned int accountNumber ;
float balance ;
} ;
Теперь объявление класса содержит только прототип функции deposit( ) . При этом само тело функции находится в другом месте. Для простоты я определил функцию в том же файле, где находится и функция main( ) .
«Так можно делать, но подобное расположение функции не очень распространено. Обычно класс определяется в заголовочном файле, а тело функции находится в отдельном исходном файле. Сама же использующая этот класс программа располагается в файле, отличном от этих двух ( подробнее об этом будет рассказано в главе 22, "Разложение классов").»
[ Советы ]
/* SavingsClassOutline — вызов фукции-члена, */
/* объявленной в классе Savings ( заголовочном файле ), но определённой */
/* в программе SavingsClassOutline или */
/* тело функции находится в отдельном исходном файле */
#include
#include
#include
using namespace std ;
#include " Savings.h "
/* Определение функции-члена Savings::deposit( ) ( обычно содержится в отдельном файле ) */
float Savings::deposit( float amount )
{
balance += amount ;
return balance ;
}
/* Основная программа */
int main( int nNumberofArgs , char* pszArgs[ ] )
{
/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */
setlocale (LC_ALL,".1251");
Savings s ;
s.accountNumber = 123456 ;
s.balance = 0.0 ;
_________________
164 стр. Часть 3. Введение в классы
/* Добавляем немного на счёт... */
cout << "Вкладываем на счёт 10 монет"
<< s.accountNumber << endl ;
s.deposit( 10 ) ;
cout << "Состояние счёта "
<< s.balance << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Определение класса содержит только прототип функции deposit( ) , а её тело определено в другом месте. Такое объявление аналогично объявлению любого другого прототипа.
Обратите внимание, что при определении функции-члена deposit( ) потребовалось указание её полного имени
float Savings::deposit( float amount )
; сокращённого имени при определении вне класса недостаточно.
►Перегрузка функций-членов...165
Функции-члены могут перегружаться так же, как и обычные функции ( обратитесь к главе 6, "Создание функций", если забыли, что это значит ). Как вы помните, имя класса является частью полного имени, и все приведённые ниже функции вполне корректны.
class Student
{
public :
/* grade — возвращает текущую среднюю оценку */
float grade( ) ;
/* grade — устанавливает новое значение оценки и возвращает предыдущее */
float grade( float newGPA )
/* ...прочие члены-данные... */
} ;
class Slope
{
public :
/* grade — возвращает снижение оценки */
float grade( ) ;
/* ...прочие члены-данные... */
} ;
/* grade — возвращает символьный эквивалент оценки */
char grade( float value ) ;
int main( int argcs , char* pArgs[ ] )
{
Student s ;
s.grade( 3.5 ) ; /* Student::grade( float ) */
float v = s.grade( ) ; /* Student::grade( ) */
char с = grade( v ) ; /* ::grade( float ) */
Slope o ;
float m = о.grade( ) ; /* Slope::grade( ) */
return 0 ;
}
_________________
165 стр. Глава 13. Работа с классами
Полные имена вызываемых из main( ) функций указаны в комментариях.
Когда происходит вызов перегруженной функции, составляющими её полного имени считаются не только аргументы функции, но и тип объекта, который вызывает функцию ( если она вызывается объектом ). Такой подход позволяет устранить неоднозначность при вызове функции.
В приведённом примере первые два вызова обращаются к функциям-членам Student::grade( float ) и Student::grade( ) соответственно. Эти функции отличаются списками аргументов. Вызов функции s.grade( ) обращается к Student::grade( ) , поскольку тип объекта s — Student .
Третья вызываемая функция в данном примере — функция ::grade( float ) , не имеющая вызывающего объекта. Последний вызов осуществляется объектом типа Slope , и соответственно вызывается функция-член Slope::grade( float ) .
_________________
166 стр. Часть 3. Введение в классы
ОГЛАВЛЕНИЕ
В этой главе...
►Определение массивов и указателей 167
►Объявление массивов объектов 168
►Объявление указателей на объекты 169
►Передача объектов функциям 171
►Зачем использовать указатели и ссылки 174
►Возврат к куче 175
►Сравнение указателей и ссылок 175
►Почему ссылки не используются вместо указателей 175
►Использование связанных списков 176
►Списки в стандартной библиотеке 180
Программисты на С++ всё время создают массивы чего-либо. Формируются массивы целочисленных значений, массивы действительных значений; так почему бы не создать массив студентов? Студенты всё время находятся в списках ( причём гораздо чаще, чем им хотелось бы ). Концепция объектов Student , стройными рядами ожидающих своей очереди, слишком привлекательна, чтобы можно было пройти мимо неё.
Читать дальшеИнтервал:
Закладка: