Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 123; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.009 с.) |