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



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


Глава 10. Объектно-ориентированное программирование
{
s p a t i a l _ v e c t o r a ;
c i n >> a ;
c o u t << "Был введён вектор: " << a << e n d l ;
}
10.2.9
Перегрузка постфиксных операторов
Большинство операций, поддерживаемых C++, являются префиксными, т. е.
оператор применяется до вычисления выражения. Исключение составляют опе-
раторы инкремента и декремента ++ и --, которые могут быть как префиксными,
так и постфиксными. При перегрузке постфиксных операций возникают опреде-
лённые неудобства: например, программист должен иметь возможность как-то
показать
компилятору, что перегружает именно постфиксный оператор.
Объявление члена класса с именем operator++ без аргументов перегружа-
ет префиксный оператор инкремента. Чтобы перегрузить функцию-член класса
как постфиксный оператор, его нужно объявить с одним аргументом типа int.
Этот аргумент не несёт никакой полезной нагрузки и нужен только, чтобы мож-
но было различить префиксные и постфиксные операторы. При выполнении этот
аргумент будет иметь нулевое значение. Следующий пример показывает разницу
в описаниях, и дополнительно выводит в консоль информацию о том, префикс-
ный или постфиксный оператор был использован. В примере использован класс
integer
, являющийся обёрткой над переменной типа int, т. е. просто хранящий
целое число:
#include 
using namespace s t d ;
c l a s s i n t e g e r
{
i n t v a l u e ;
public :
i n t e g e r ( ) { v a l u e = 0 ; }
i n t e g e r& operator++() ;
//префиксный оператор
i n t e g e r& operator++(i n t ) ; //постфиксный оператор
} ;
i n t e g e r& i n t e g e r : : operator++()
{
v a l u e +=1;
c o u t << "Использован префиксный оператор\ n " ;
return ∗ t h i s ;
}
i n t e g e r& i n t e g e r : : operator++(i n t )
{
v a l u e +=1;
c o u t << "Использован постфиксный оператор\ n " ;
return ∗ t h i s ;
}
main ( )
{
i n t e g e r i ;
i ++; //используется постфиксный оператор
++i ; //используется префиксный оператор
}
Заметим, что в приведённом примере оператор постфиксного инкремента реа-
лизован не совсем корректно и по действию не отличается от префиксной формы.
Программирование на языке С++ в среде Qt Creator


10.3. Создание и удаление объектов
285
Если требуется реализовать в программе его полноценный функционал, т. е. из-
менение аргумента после возврата его исходного значения, для этого в теле опе-
ратора создаётся и потом возвращается временный объект — копия исходного
аргумента. Подробнее особенности передачи временной копии объекта рассмат-
риваются в следующих подразделах, а пример с полнофункциональной формой
постфиксных операторов с дополнительными пояснениями можно найти в конце
п. 10.3.3.
10.3
Создание и удаление объектов
10.3.1
Присваивание объектов, передача в функцию и возвращение
объекта
Можно заметить, что в ряде случаев (например, при перегрузке операторов)
мы использовали передачу объекта в функцию и возвращение не по значению,
а с использованием ссылки. Для этого существует достаточно веская причина:
передача объектов по значению, равно как и их присваивание, может приводить
к нежелательным последствиям.
Один объект можно присвоить другому, если оба объекта имеют одинако-
вый тип (если объекты имеют разные типы, то компилятор выдаст сообщение
об ошибке). По умолчанию, когда объект A присваивается объекту B, то осу-
ществляется побитовое копирование всех элементов-данных A в соответствую-
щие элементы-данные B. Именно это копирование и является потенциальным
источником проблем. Особенно внимательным нужно быть при присваивании
объектов, имеющих свойства-указатели.
Рассмотрим в качестве примера класс matrix, хранящий в себе прямоуголь-
ную матрицу из элементов типа double. Размерность матрицы будет передавать-
ся конструктору класса, после чего будет выполняться динамическое выделение
памяти под нужное количество элементов. В классе будут также предусмотре-
ны методы get_val() чтобы получить элемент матрицы с индексами (i,j) и
set_val()
чтобы установить в заданный элемент новое значение.
Однако присвоив просто так одну переменную типа matrix другой, мы не
сможем избежать побочных эффектов.
#include 
using namespace s t d ;
c l a s s m a t r i x
{
double ∗m; //элементы матрицы
s i z e _ t width , h e i g h t ; //число строк и столбцов в матрице
public :
m a t r i x ( s i z e _ t w, s i z e _ t h ) ;
double g e t _ v a l ( s i z e _ t i , s i z e _ t j ) ;
void s e t _ v a l ( s i z e _ t i , s i z e _ t j , double v a l ) ;
~ m a t r i x ( ) ;
} ;
m a t r i x : : m a t r i x ( s i z e _ t w, s i z e _ t h )
{
m = new double [ w∗h ] ;
width = w ;
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.


286
Download 5,27 Mb.

Do'stlaringiz bilan baham:
1   ...   120   121   122   123   124   125   126   127   ...   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