Претоварването, програмиране на С и С

C ++ претоварване оператори опори (претоварване оператор). С малки изключения, повечето C ++ оператори могат да бъдат претоварени, в резултат на което те ще получат стойност специална позиция по отношение на определени класове. Например, клас, който определя списък свързан смукателно, може да се използва оператор + за добавяне на обект в списъка. Друг клас да използвате оператора + по съвсем различен начин. Когато оператор е претоварена, никой от първоначалната си стойност не губи смисъл. Само един нов оператор е определен за даден клас обекти. Ето защо, претоварване оператор +, за да се справят с кон-свързан списък не се променя действията си във връзка с числа.

функции на оператора обикновено са членове или приятели от класа, за които те се използват. Въпреки многото прилики, има определена разлика между ОД-БАМИ, което претоварва член функции на оператора и операторски функции-приятели. В този раздел ще разгледа само дейностите на страните от претоварване. По-късно в тази глава, до момента, Zano, как претоварен функции на задвижването, приятели.

За да се претовари оператор, трябва да се определи какво се разбира от оператора по отношение на класа, към който се прилага това. За тази цел, той определя функция за оператора, който определя действията на оператора. Общата форма на функцията на оператор за случая, когато тя е член на класа е, както следва:

типово име :: оператор # (Списъкът с аргументи)
// действия, определени във връзка с клас
>

Тук претоварен оператор е заместен за # символ, и тип определя типа на стойности, WHO-завъртат от оператора. С цел опростяване на използването на претоварен оператор
сложни изрази, като обратна стойност, често избират от същия тип като на класа, за която е претоварена оператора. Естеството на списъка с аргумента не се определя от няколко фактора, както ще се види по-долу.

За да видите как претоварва оператора, започнете с един прост пример. Тя ще се изгради etsya клас three_d, съдържащ координатите на обекта в триизмерното пространство. Следваща про-гр претоварва + = и three_d клас:

#include
клас three_d междинно съединение X, Y, Z; // триизмерни координати
публичния:
three_d оператори + (three_d т);
three_d оператор = (three_d т);
нищожен шоу ();
нищожен присвоите (инт MX, Int ми, вътр MZ);
>;
// претоварване +
three_d three_d :: оператор + (three_d т)
three_d температура;
temp.x = х + Т. х;
temp.u = Y + t.y;
temp.z = Z + t.z;
върнете температура;
>
// претоварване =
three_d three_d :: оператор = (three_d т)
х = Т. х;
у = t.y;
Z = t.z;
върнете * това;
>
// изход координати X, Y, Z
нищожен three_d :: шоу ()
Cout < Cout <<у <<", ";
Cout <>
// Задаване Координати
нищожен three_d :: присвоите (инт MX, Int ми, вътр MZ)
х = х;
у = ми;
Z = MZ;
>
INT главната ()
three_d А, В, С;
a.assign (1, 2, 3);
b.assign (10, 10, 10);
a.show ();
b.show ();
С = А + В; // Добавянето на а и б
c.show ();
С = А + В + С; // добавяне на а, Ь и
s.show ();
А = В = с; // демонстрация на множествена задача
s.show ();
b.show ();
връщане 0;
>

Тази програма показва следната информация:

1, 2, 3
10, 10, 10
11, 12, 13
22, 24, 26
1, 2, 3
1, 2, 3

Ако разгледаме внимателно програмата е изненада, че и двете функции, оператор-Rathor има само един параметър, независимо от факта, че те претовари двоичен оператор. Това се дължи на факта, че в случай на претоварване двоичен оператор, който използва й функция член изрично предава само един аргумент. Вторият аргумент е AUC-като наличието това, че се предава на имплицитно. По този начин, в съответствие

х съответства на това-> х, където х е свързана с обект, който изисква операторът на функция. Във всички случаи, това е обект, от лявата страна на знака на операцията призовава оператора. Обект стои отдясно на операцията по знак, преминал към функция.

Когато претоварване на едноместно функция на работа операторът не е включена лампа, и оператора на функция е един параметър в двоичен операцията е претоварена. (Не претоварвайте триада оператора.) Във всички случаи, на обективната функция се активира, операторът се предава безусловно по време на използването на този указател.

Друг ключов претоварване допълнение оператор е, че той се връща обект от тип three_d. Въпреки че функцията може да има като стойност всеки валиден тип Yazi Единична C ++, фактът, че той се връща three_d тип обект, позволява на оператора + за по-сложни изрази като A + B + C. Когато + B се произвежда в резултат на тип three_d. Тази стойност се прибавя към С. Ако стойността на сумата от А + Б имали стойност от друг вид, не можем да го добавете към.

За разлика от оператора +, оператор за присвояване променя своите аргументи. (Това, между другото, е значението на задача.) От оператора = функция () се нарича с обекта отляво на знака за равенство, а след това този обект е променен
при извършване на операции за присвояване. Въпреки това, дори оператор задача е длъжен ВРЪЩАНЕ-Schat значение както в C ++, и оператора за присвояване произвежда количеството от дясната страна на равенството. Така че, следващия израз

Това е валидно, че е необходимо операторът на оператор = () връща обекта, към който UCA-свързва този показалеца и обекта се стои на лявата страна на оператора чрез присвояване-ТА. Ако направите това, можете да извършвате множество задача.

Можете да претовари Унарният оператори като ++ или -. Както бе споменато по-рано, когато претоварване на едноместно оператор, който използва член функция, тази функция Коментари Няма аргументи. Вместо това, операцията се извършва на обекта на извършване на функциите на оператора обаждане от косвения прехвърлянето на тази показалка. Като пример, по-долу се счита разширение rennaya версия на предишната програма, която определя инкрементиране оператор three_d тип обект:

#include
клас three_d междинно съединение X, Y, Z; // триизмерни координати
публичния:
three_d оператор + (three_d OP2); // ОР1 означава
three_d оператор = (three_d OP2); // ОР1 означава
three_d оператор ++ (); // ОР1 е предназначен
нищожен шоу ();
нищожен присвоите (инт MX, Int ми, вътр MZ);
>;
// претоварване +
three_d three_d :: оператор + (three_d OP2)
three_d температура;
temp.x = х + op2.x; // допълнение число
temp.u = Y + op2.y; // в този случай запазва +
temp.z = Z + op2.z; // първоначална стойност
върнете температура;
>
// претоварване =
three_d three_d :: оператор = (three_d OP2)
х = op2.x; // задача число
у = op2.y; // в този случай запазва =
Z = op2.z; // първоначална стойност
върнете * това;
>
// претоварване унарна
three_d three_d :: оператор ++ ()
х ++;
Y ++;
Z ++;
върнете * това;
>
// показва координати X, Y, Z
нищожен three_d :: шоу ()
Cout < Cout <<у <<", ";
Cout <>
// Задаване Координати
нищожен three_d :: присвоите (инт MX, Int ми, вътр MZ)
х = х;
у = ми;
Z = MZ;
>
INT главната ()
three_d А, В, С;
a.assign (1, 2, 3);
b.assign (10, 10, 10);
a.show ();
b.show ();
С = А + В; // Добавянето на а и б
c.show ();
С = А + В + С; // добавяне на а, Ь и
s.show ();
А = В = с; // демонстрация на множествена задача
s.show ();
b.show ();
++С; // увеличение от
c.show ();
връщане 0;
>

В предишни версии на C ++, че е невъзможно да се определи, преди или след операнд претоварен оператор ++ или -. Например, за даден обект за следните две отчети са идентични:

Въпреки това, по-късно версии на C ++ позволява да се направи разграничение между префикс и постфиксна оператори тори-тънката и спадане. За да направите това, програмата трябва да идентифицира двете версии на оператора ++ функцията (). Един от тях трябва да бъде същият, както е показано в предишната програма. Дрю Гая обявена, както следва:

цит оператор ++ (междинно съединение X);

Ако ++ предхожда операнд, функцията се нарича оператор ++ (). Ако ++ следва операнда, тогава функция се нарича оператор ++ (междинно съединение X), където х е на стойност 0.

Действие претоварен оператор по отношение на класа, за които е определено, лен не трябва да се съобразят с по никакъв начин на действието на този оператор за вградени типове C ++. Например, оператори <<и>> Позоваване на CIN и Cout нямат почти нищо общо с ефекта им върху променливите на цяло число. Въпреки това, въз основа на желанието да направят кода по-лесен за четене и добре структурирана, че е желателно, че е претоварен Opera-Тори отговаря, когато е приложимо, по смисъла на оригиналните оператори. Например, операторът + за класа three_d концептуално подобна на оператора + за променливи от тип цяло число. Малката използване, например, може да се очаква от такова + оператор, чието действие на
съответния клас ще наподобява действието на оператора ||. Въпреки че е възможно да се даде на оператора претоварен-zhennomu никакъв смисъл по техен избор, но за по-голяма яснота на прилагането му, че е желателно новата стойност е свързана с първоначалната стойност.

Има някои ограничения за претоварва оператора. На първо място, не може да се променя, когато на оператор-ority. На второ място, не можете да промените броя на операнди на оператора. И накрая, за оператори изключени-cheniem задача се претоварва, наследени от всеки получен клас. Всеки клас трябва да определи ясно своите собствени претоварени оператори, Rathore = ако това е необходимо за всякакви цели. Разбира се, извлечени класове може да зареди повторно всеки оператор, включително и този, който е бил претоварен базов клас. Следните оператори не могат да бъдат претоварени:
. *?