Alt linux Программирование на языке С++ в среде Qt Creator Е. Р. Алексеев, Г. Г. Злобин, Д. А. Костюк, О. В. Чеснокова, А. С. Чмыхало Москва alt linux 2015



Download 5,27 Mb.
Pdf ko'rish
bet123/193
Sana24.02.2022
Hajmi5,27 Mb.
#227496
1   ...   119   120   121   122   123   124   125   126   ...   193
Bog'liq
Book-qtC


Глава 10. Объектно-ориентированное программирование
Следует отметить, что нельзя объявить оператор как статический метод (по-
скольку статическим методам указатель this при вызове не передаётся) или
использовать с оператором аргументы по умолчанию
Для одного и того же оператора можно объявить несколько перегруженных
операторов-функций. Но, как и в случае перегрузки обычных функций, компи-
лятор должен различать их по типу и количеству аргументов. Когда компилятор
сталкивается с перегруженным оператором для класса X, он ищет подходящую
функцию-оператор для класса Х, используя обычные для перегруженных функ-
ций правила сопоставления аргументов. Если поиск завершился неудачей, ком-
пилятор не пытается самостоятельно применить к аргументам перегруженных
операторов преобразования типов.
Механизм дружественных функций часто используется при перегрузке опе-
раторов для работы с объектами, когда по какой-то причине перегруженный
оператор невозможно или нецелесообразно объявлять членом класса. Для срав-
нения изменим фрагмент примера из п. 10.2.7, переопределив оператор «+» как
функцию-член класса (слева) и как дружественную функцию (справа):
c l a s s s p a t i a l _ v e c t o r
{
. . . . .
s p a t i a l _ v e c t o r operator+(
s p a t i a l _ v e c t o r b ) ;
} ;
s p a t i a l _ v e c t o r s p a t i a l _ v e c t o r : :
operator+( s p a t i a l _ v e c t o r b )
{
s p a t i a l _ v e c t o r c ;
c . x = x + b . x ;
c . y = y + b . y ;
c . z = z + b . z ;
return c ;
}
c l a s s s p a t i a l _ v e c t o r
{
. . . . .
f r i e n d s p a t i a l _ v e c t o r operator+(
s p a t i a l _ v e c t o r a , s p a t i a l _ v e c t o r b ) ;
} ;
s p a t i a l _ v e c t o r operator+(
s p a t i a l _ v e c t o r a , s p a t i a l _ v e c t o r b )
{
s p a t i a l _ v e c t o r c ;
c . x = a . x + b . x ;
c . y = a . y + b . y ;
c . z = a . z + b . z ;
return c ;
}
Классический пример перегрузки оператора как дружественной функции —
средства стандартного ввода-вывода в C++. Как известно, операции << и >> вы-
полняют ввод и вывод, если левым аргументом указан один из стандартных объ-
ектов ввода-вывода. Предопределённые объекты cin (клавиатура) и cout (дис-
плей) — экземпляры классов istream и ostream. Этим способом можно вывести
любой базовый тип данных C++. Однако, на самом деле при выводе вызывается
функция, перегружающая оператор. В частности, для объекта cout будет вы-
звана функция, имеющая приблизительно следующий вид:
o s t r e a m operator<<(ostream , i n t )
В результате, выражение
c o u t << "Значение переменной i равно " << i << ’ \ n ’ ;
благодаря такой подстановке будет заменено на
operator<<(operator<<(operator<<(cout , "Значение переменной i равно " ) , i ) , ’ \ n ’ ) ;
Программирование на языке С++ в среде Qt Creator


10.2. Классы и объекты в C++
283
Понятно, что библиотека iostream содержит функции только для встроен-
ных типов. Если требуется перегрузить операторы стандартного ввода-вывода
для нового класса, чтобы программист мог вводить с консоли его информаци-
онное содержимое или выполнять его вывод на экран, необходимо перегрузить
оператор для нового типа.
Использовать перегрузку оператора как члена класса невозможно, т. к. ле-
вым аргументом должен быть не объект нового класса, а уже существующие
объекты cin и cout. Таким образом, перегружать оператор приходится как внеш-
нюю функцию. Однако поскольку эту функцию создаёт автор нового класса, он
вполне может объявить её в структуре класса как дружественную, упростив ей
доступ к закрытой части класса.
В общем виде операция вывода имеет следующую форму
o s t r e a m& operator << ( ostream& stream , имя_класса& o b j )
{
s t r e a m << . . . //вывод элементов объекта obj в поток stream
return stream ;
}
Аналогичным образом может быть определена функция ввода:
i s t r e a m& operator >> ( i s t r e a m& stream , имя_класса& o b j )
{
s t r e a m >> . . . //ввод элементов объекта obj из потока stream
return stream ;
}
Знак «&» в списке формальных параметров означает, что компилятор обес-
печивает скрытую передачу параметра не по значению, а по ссылке (передача
объектов по ссылке детально рассмотрена далее, в п. 10.3.2. Первый аргумент
функций ввода и вывода определён как ссылка на поток, второй аргумент —
ссылка на объект, выводящий или получающий информацию, а возвращаемое
значение — тот же самый объект потока, который был передан в качестве пер-
вого аргумента.
Приведём пример с перегрузкой операторов стандартного ввода и вывода для
уже знакомого нам класса spatial_vector.
#include 
using namespace s t d ;
c l a s s s p a t i a l _ v e c t o r
{
double x , y , z ;
public :
s p a t i a l _ v e c t o r ( ) { x=y=z =0; }
f r i e n d os tream& operator<< ( os tream& stream , s p a t i a l _ v e c t o r& b ) ;
f r i e n d i s t r e a m& operator>> ( i s t r e a m& stream , s p a t i a l _ v e c t o r& b ) ;
} ;
o s t r e a m& operator<< ( ostream& stream , s p a t i a l _ v e c t o r& b )
{
s t r e a m << " x = " << b . x << " ; y = " << b . y << " ; z = " << b . z << e n d l ;
return stream ;
}
i s t r e a m& operator>> ( i s t r e a m& stream , s p a t i a l _ v e c t o r& b )
{
s t r e a m >> b . x >> b . y >> b . z ;
return stream ;
}
main ( )
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.


284
Download 5,27 Mb.

Do'stlaringiz bilan baham:
1   ...   119   120   121   122   123   124   125   126   ...   193




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish