Операції арифметичного присвоювання 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операції арифметичного присвоювання



Закінчимо вивчення перезавантаження бінарних операцій на прикладі арифметичного присвоювання +=. Ця операція виконує присвоювання і додавання одночасно. Ми будемо використовувати цю операцію для додавання інтервалів, записуючи результат у змінну, що означає перший інтервал. Приведемо лістінг програми 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 с.)