Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Операції арифметичного присвоювання
Закінчимо вивчення перезавантаження бінарних операцій на прикладі арифметичного присвоювання +=. Ця операція виконує присвоювання і додавання одночасно. Ми будемо використовувати цю операцію для додавання інтервалів, записуючи результат у змінну, що означає перший інтервал. Приведемо лістінг програми 10.9 (базується на програмі 10.7) #include <iostream.h> #include <conio.h> #include <bios.h> class Distance {private: int feet; float inches; public:
Distance():feet(0),inches(0.0) //Конструктор без аргументів { }
//Конструктор з 2 аргументами Distance(int ft,float in):feet(ft),inches(in) { }
void getdist() {cout <<”\nВведіть число футів “; cin >>feet; cout << “Дюймів “; cin>>inches; }
void showdist() {cout <<feet << “\’ “<< inches <<”\’’”;}
Distance operator+(Distance) const;
int operator<(Distance) const;
void operator+= (Distance);
}; //Додавання d2 I d3 Distance Distance::operator+(Distance d2) const { int f=feet+d2.feet; float i=inches+d2.inches; if(i>=12.0) {i-=12.0; f++;} return Distance(f,i); }
int Distance::operator<(Distance d2) const {float bf1=feet+inches/12; float bf2=d2.feet+d2.inches/12; return (bf1<bf2)?1:0; }
void Distance::operator+=(Distance d2) {feet+=d2.feet; inches+=d2.inches; if (inches>=12.0) {inches-=12.0; feet++; } }
int main() { clrscr(); Distance dist1; dist1.getdist(); cout<<”\ndist1=”;dist1.showdist(); Distance dist2(11,6.25); cout<<”\ndist2=”;dist2.showdist(); dist1+=dist2; cout<<”\nПісля операції:”; cout<<”\ndist1=”;dist1.showdist(); cout<<endl; bioskey(0); return 0; } Програма 10.9
Зауважимо, що у функції operator+=() цієї програми об’єктом, що приймає значення суми, є об’єкт, який викликає цю функцію. Тому feet та inches є заданими величинами, а не тимчасовими змінними, які використовуються тільки для повернутого об’єкту. Функція operator+=() не повертає жодного значення і має тип void. Але, якщо ми захочемо використати цю операцію в складніших виразах, таких як dist=dist1+=dist2; то нам буде потрібне значення, яке повертається. Ми можемо ввести його, записавши в кінці визначення функції operator+=() рядок return Distance(feet, inches); в якій безіменний об’єкт ініціалізується тим самим значенням, що й об’єкт, який викликає функцію, і потім повертається.
Операція індексації масиву Операція індексації, яка звичайно використовується для доступу до елементів масиву, може бути перезавантажена. Це корисно в тому випадку, коли ми хочемо змінити спосіб роботи С++ з масивами. Наприклад, нам може знадобитися «безпечний масив», в якому закладена автоматична перевірка використовуваного для доступу до масиву індексу елемента. Вона буде перевіряти, чи не вийшли ми за межі масиву.
Реалізувати перезавантаження операції можна різними способами. Далі представлені три: § з використанням двох окремих методів put() і get() (програма 10.10) § з використанням методу access(), що використовує повернення за посиланням (програма 10.11) § перезавантажена операція [], що використовує повернення за посиланням (програма 10.12).
#include <iostream.h> #include <conio.h> #include <bios.h> #include <process.h> const int LIMIT=100; class safearray {private: int arr[LIMIT]; public: void putel(int n,int elvalue) {if (n<0 || n>=LIMIT) {cout<<”\nПомилковий індекс!”;exit(1);} arr[n]=elvalue; }
int getel(int n) const {if(n<0|| n>=LIMIT) {cout<<”\nПомилковий індекс!”;exit(1);} return arr[n]; } }; //////////////// int main() { clrscr(); safearray sal; //elementy for (int j=0;j<LIMIT;j++) sal.putel(j,j*10); //показати for (j=0;j<LIMIT;j++) {int temp=sal.getel(j); cout<<”Елемент “<<j<<”=”<<temp<<endl; } bioskey(0); return 0; } Програма 10.10
#include <iostream.h> #include <conio.h> #include <bios.h> #include <process.h> const int LIMIT=10; class safearray {private: int arr[LIMIT]; public: int& access(int n) { if (n<0||n>=LIMIT) {cout<<"\nПомилковий індекс:";exit(1);} return arr[n]; } }; //////////////// int main() { clrscr(); safearray sal; //елементи for (int j=0;j<LIMIT;j++) sal.access(j)=j*10; //показати for (j=0;j<LIMIT;j++) {int temp=sal.access(j); cout<<"Елемент "<<j<<"="<<temp<<endl; } bioskey(0); return 0; } Програма 10.11 У цій програмі рядок sal.access(j)=j*10; означає, що значення j*10 буде поміщене в елемент масиву arr[j], посилання на який повертається методом.
#include <iostream.h> #include <conio.h> #include <bios.h> #include <process.h> const int LIMIT=10; class safearray {private: int arr[LIMIT]; public: int& operator[](int n) { if (n<0||n>=LIMIT) {cout<<"\nПомилковий індекс:";exit(1);} return arr[n]; } }; //////////////// int main() { clrscr(); safearray sal; //elementy for (int j=0;j<LIMIT;j++) sal[j]=j*10; //show for (j=0;j<LIMIT;j++) {int temp=sal[j]; cout<<"Елемент "<<j<<"="<<temp<<endl; } bioskey(0); return 0; } Програма 10.12 В цій програмі ми можемо використовувати звичайний запис операції індексації масиву sal[j]=j*10; і temp=sal[j] для вводу-виводу елементів масиву.
Перетворення типів Ми вже знаємо, що операція присвоєння = використовується для присвоєння значення змінної певного типу змінній того ж типу, причому це може бути як основний тип, так і тип, визначений користувачем. Але що трапиться, коли з різних сторін знаку = записані змінні різних типів? Насправді це досить складне питання, яким і займемося. Спершу розглянемо, як компілятор виконує перетворення основних типів, яке відбувається автоматично. Потім пояснимо кілька ситуацій, де компілятор не виконує автоматичного перетворення і ми самі повинні визначити його дії. В ці ситуації включені перетворення між основними і визначеними користувачем типами та перетворення між різними типами, визначеними користувачем.
У таких мовах, як Паскаль, здійснені спроби вивільнити розробника від необхідності проробляти подібні перетворення. Однак філософія С++ - це гнучкість, надана можливістю здійснювати всеможливі перетворення.
|
||||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 66; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.133.96 (0.013 с.) |