Перегрузка функций: правила перегрузки, выбор функции. Использование перегруженных функций.
Перегрузка функций позволяет вашим программам определять несколько функций с одним и тем же именем и типом возвращаемого значения.
Cуществует два основных способа перегрузки операторов: глобальные функции, дружественные для класса, или подставляемые функции самого класса.
intadd_values(inta,int b) //Перегруженнаяфункция (2 параметра)
{
return(a + b);
}
intadd_values (int a, int b, int c)// Перегруженнаяфункция (3 параметра)
{
return(a + b + c);
}
void main(void)
{
cout<< "200 + 801 = " <<add_values(200, 801) <<endl; // Использованиефункциис 2 параметрами
cout<< "100 + 201 + 700 = " <<add_values(100, 201, 700) <<endl; // Использованиефункциис 3 параметрами
}
Одним из наиболее общих случаев использования перегрузки является применение функции для получения определенного результата, исходя из различных параметров.
Перегрузка операторов: правила перегрузки, перегрузка бинарных и унарных операторов. Использование перегруженных операторов. Понятие объектов функций (функторов).
Синтаксис перегрузки
class Integer
{
private:
int value;
public:
Integer(inti): value(i)
{}
const Integer operator+(const Integer&rv) const {//перегрузкаунарногооператора
return (value + rv.value);
}
};
Перегрузкаунарныхоператоров
Рассмотрим примеры перегрузки унарных операторов(++,--) для определенного выше класса Integer. Заодно определим их в виде дружественных функций и рассмотрим операторы декремента и инкремента:
class Integer
{
private:
int value;
|
|
public:
Integer(inti): value(i)
{}
//префиксныйинкремент
friendconst Integer&operator++(Integer&i);
//постфиксныйинкремент
friendconst Integer operator++(Integer&i, int);
};
//префиксная версия возвращает значение после инкремента
const Integer&operator++(Integer&i) {
i.value++;
returni;
}
//постфиксная версия возвращает значение до инкремента
const Integer operator++(Integer&i, int) {
Integer oldValue(i.value);
i.value++;
returnoldValue;
}
В случае, когда он видит выражение ++i, то вызывается функция operator++(a). Если же он видит i++, то вызывается operator++(a, int). То есть вызывается перегруженная функция operator++, и именно для этого используется фиктивный параметр int в постфиксной версии.
Бинарные операторы
Рассмотрим синтаксис перегрузки бинарных операторов. Перегрузим один оператор, который возвращает l-значение, один условный оператор и один оператор, создающий новое значение (определим их глобально):
class Integer
{
private:
int value;
public:
Integer(inti): value(i)
{}
friendconst Integer operator+(const Integer& left, const Integer& right);
friend Integer&operator+=(Integer& left, const Integer& right);
friendbooloperator==(const Integer& left, const Integer& right);
};
const Integer operator+(const Integer& left, const Integer& right) {
return Integer(left.value + right.value);
}
Integer&operator+=(Integer& left, const Integer& right) {
left.value += right.value;
return left;
|
|
}
booloperator==(const Integer& left, const Integer& right) {
returnleft.value == right.value;
}
Друзья класса: их назначение, области применения. Определение и использование функции-друга класса. Различия между членами и друзьями класса. Функции и перегруженные операторы – члены и друзья класса.
Принцип инкапсуляции и ограничения доступа к данным запрещает функциям, не являющимся методами соответствующего класса, доступ к скрытым или защищенным данным объекта. Политика этих принципов ООП такова, что , если функция не является членом объекта, она не может пользоваться определенным рядом данных. Тем не менее есть ситуации, когда такая жесткая дискриминация приводит к значительным неудобствам.
C++ позволяет друзьям определенного класса обращаться к частным элементам этого класса. Чтобы указать C++, что один класс является другом (friend) другого класса, вы просто помещаете ключевое слово friend и имя соответствующего класса-друга внутрь определения этого другого класса.
class beta;
class alpha {
private:
int data;
public:
alpha():data(3) {} //конструкторбезаргументов
friendintfrirunc(alpha, beta);// дружественная функция
};
class beta {
private:
int data;
public:
beta():data(7) {}
friendintfrifunc(alpha, beta);
};
|
|
intfrifunc(alpha a, beta b) { //определениефункции
return (a.data + b.data);
};
int main() {
alpha aa;
beta bb;
cout<<frifunc(aa, bb) <<endl; // вызовфункции
return 0;
}
Главное не забывать, что обращаться к классу до его объявления нельзя, иначе будет ошибка, именно поэтому beta объявлен в начале, а определен позже.
Дата добавления: 2018-04-15; просмотров: 437; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!