Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Самоучитель С++ - Шилдт Г.

Шилдт Г. Самоучитель С++ — Спб.: БВХ-Петербург, 2003. — 688 c.
ISBN 5-7791-0086-1
Скачать (прямая ссылка): samouchitelc2003.djvu
Предыдущая << 1 .. 26 27 28 29 30 31 < 32 > 33 34 35 36 37 38 .. 206 >> Следующая

truck(int w, int s) { weight = w; speed = s; } friend int sp_greater(car c, truck t) ;
};
/* Возвращает положительное число, если легковая машина быстрее грузовика. Возвращает 0 при одинаковых скоростях. Возвращает отрицательное число, если грузовик быстрее легковой машины.
*/
int sp greater (car с, truck t)
f
return с. speed — t. speed;
}
int main{) і
I
int t;
car cl(6, 55)f c2 (2, 120) ;
truck tl (10000, 55), t2 (2000Q, 72);
cout << "Сравнение значений cl и tl:\n*';
t = sp_greater (cl, tl) ;
if(t<0) cout « "Грузовик быстрее. \nM;
else if(t==0) cout << "Скорости машин одинаковы. \n";
else cout << "Легковая машина быстрее. \n";
гпава 3. Подробное изучение классов__________________________________________101
cout << "\г. Сравнение значений с2 и t2:\n";
t = sp_greater(с2, l2);
if (t<0) cout << "Грузовик быстрее. \n";
else іf (t==0j cout « "Скорости машин одинаковы. \n";
else cout << "Легковая машина быстрее. \n";
return 0;
I
В этой программе имеется функция sp_greater(), которая дружественна для классов саг и truck. (Как уже установлено, функция может быть дружественной двум и более классам.) Эта функция возвращает положительное число, если объект саг движется быстрее объекта truck, нуль, если их скорости одинаковы, и отрицательное число, если скорость объекта truck больше, чем скорость объекта саг.
Эта программа иллюстрирует один важный элемент синтаксиса C++ — предварительное объявление (forward declaration), которое еще называют ссылкой вперед (forward reference). Поскольку функция sp_greater() получает параметры обоих классов саг и truck, то логически невозможно объявить и тот и другой класс перед включением функции sp_greatcr{) в каждый из них. Поэтому необходим иной способ сообщить компилятору имя класса без его фактического объявления. Этот способ и называется предварительным объявлением. В C++, чтобы информировать компилятор о том, что данный идентификатор является именем класса, перед первым использованием имени класса вставляют следующую строку:
class имя_класса;
, Например, в предыдущей программе предварительным объявлением является инструкция
class truck;
после которой класс truck можно использовать в объявлении дружественной функции sp greaterQ без опасения вызвать ошибку компилятора.
2. Функция может быть членом одного класса и дружественной другому. Например, если переписать предыдущий пример так, чтобы функция sp_greater() являлась членом класса саг и дружественной классу truck, то получится следующая программа:
f t include <i os t ream>
using namespace std;
class truck; // предварительное объявление
class car {
int passengers; int speed;
7 02_________________________________________________________________Самоучитель С++
public:
car (int p, int s) { passengers = p; speed = s; } int sp_greater(truck t) ;
class truck { int weight; int speed; public:
truck (int w, int s) ( weight = w; speed = s; }
// отметьте новое использование / / оператора расширения области видимости friend int car: :sp_greater(truck t) ;
};
/* Возвращает положительное число, если легковая машина быстрее грузовика * Возвращает 0 при одинаковых скоростях . Возвращает отрицательное число, если грузовик быстрее легковой машины.
*/
int car: : sp_greater (truck t)
{
/* Поскольку функция sp_greater() — это член класса саг, ей должен передаваться только объект truck
*/
return speed — t* speed;
}
int main ( )
(
int t ;
car cl(6, 55), c2 (2, 120) ; truck tl (10000, 55) , t2{20000, 72);
cout << "Сравнение значений cl и tl:\n";
t = cl . sp_greater (tl) ; // вызывается как функция-член класса car
if(t<0) cout « "Грузовик быстрее. \nM;
else if(t==0) cout << "Скорости машин одинаковы. \n";
else cout << "Легковая машина быстрее . \n" ;
cout « ’’ХпСравнение c2 и t2:\n";
t = c2 . sp_greater (t2) ; // вызывается как функция-член класса car
if (t<0) cout << "Грузовик быстрее. \n";
else if {t—— 0) cout << "Скорости машин одинаковы. \n";
else cout << "Легковая машина быстрее . \nM ;
return 0;
Гпава 3. Подробное изучение классов.
юз
Обратите внимание на новое использование оператора расширения области видимости, который имеется в объявлении дружественной функции внутри объявления класса truck. В данном случае он информирует компилятор о том, что функция sp greaterQ является членом класса саг.
Существует простой способ запомнить, где в такой ситуации нужно указывать оператор расширения области видимости: сначала идет имя класса, потом - оператор расширения области видимости и последним - имя функции-члена. Таким образом член класса будет полностью задан.
Фактически при упоминании в программе члена класса никогда не помешает полностью (с именем класса и оператором расширения области видимости) задать его имя. Однако при использовании объекта для вызова функции-члена или для доступа к переменной-члену, полное имя обычно излишне и употребляется редко. Например, инструкция
Предыдущая << 1 .. 26 27 28 29 30 31 < 32 > 33 34 35 36 37 38 .. 206 >> Следующая