- •Введение в перегрузку операций
- •Операции, как функции
- •Использование перегруженных операций
- •Ограничения в перегрузке операций
- •Перегрузка операций через дружественные функции
- •Перегрузка операций через дружественные функции
- •Int main () {
- •I have 16 dollars.
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Дружественные функции могут быть определены внутри класса
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Перегрузка операций с операндами разных типов
- •Int m_dollars;
- •Int getDollars () {return m_dollars;}
- •Int main () {
- •Values (int min, int max) {
- •Int getMin () {return m_min;}
- •Int getMax () {return m_max;}
- •Int main () {
- •Int main () {
- •Int main () {
- •Перегрузка операций через обычные функции
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Перегрузка операций ввода и вывода
- •Void print () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Int m_numerator;
- •Int m_denominator;
- •Void reduce () {
- •Void print () {
- •Перегрузка операций через методы классов
- •Int m_dollars;
- •Int getDollars () { return m_dollars; }
- •Int main () {
- •Int m_dollars;
- •Int getDollars () {return m_dollars;}
- •Int main (){
- •Не всё может быть перегружено через дружественные функции
- •Не всё может быть перегружено через методы класса
- •Int main (){
- •Какой способ перегрузки и когда следует использовать?
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •If (!isHappy)
- •Int main () {
- •If (!something)
- •Перегрузка операций сравнения
- •Int main () {
- •Int m_dollars;
- •Int main () {
- •Перегрузка операторов инкремента и декремента
- •Int m_number;
- •Int main () {
- •Перегрузка операций инкремента и декремента версии постфикс
- •Int m_number;
- •Int main () {
- •Перегрузка операции индексации []
- •Почему оператор индексации [] использует возврат по ссылке?
- •Использование оператора индексации с константными объектами класса
- •Int& operator[] (const int index);
- •Int main (){
- •IntArray array;
- •Проверка ошибок
- •Int m_array[10];
- •Int& operator [] (const int index);
- •Int& IntArray::operator[] (const int index) {
- •Указатели на объекты и перегруженный оператор []
- •Передаваемый аргумент не обязательно должен быть целым числом
- •Void operator [] (std::string index);
- •Void Something::operator [] (std::string index){
- •Int main () {
- •Перегрузка операции ()
- •Int main () {
- •Void operator() ();
- •Void Matrix::operator()() {
- •Int main() {
- •Перегрузка операций преобразования типов данных
- •Int m_dollars;
- •Int getDollars () { return m_dollars; }
- •Int main () {
Int m_dollars;
public:
Dollars (int dollars) {m_dollars = dollars;}
// Выполняем -Dollars через метод класса
Dollars operator- () const;
Int getDollars () const {return m_dollars;}
};
// Эта функция является методом класса!
Dollars Dollars::operator- () const {
return Dollars (-m_dollars);
}
Int main () {
const Dollars dollars1(7);
std::cout << "My debt is " << (-dollars1).getDollars() << " dollars.\n";
return 0;
}
Примечание: Определение метода можно записать и внутри класса. Здесь мы определили его вне тела класса для лучшей наглядности.
Всё довольно-таки просто. Перегрузка унарной операции минус (-) осуществляется через метод класса, так как явные параметры в функции перегрузки отсутствуют (только неявный объект, на который указывает скрытый указатель this).
Операция унарный (-) возвращает объект Dollars с отрицательным значением m_dollars.
Поскольку эта операция не изменяет самого объект класса Dollars, то мы можем (и должны) сделать функцию перегрузки константной (чтобы иметь возможность использовать эту операцию и с другими константными объектами класса Dollars).
Обратите внимание, путаницы между отрицательной унарной операцией минус (-) и бинарной операцией минус (-) нет, так как они имеют разное количество параметров.
Вот еще один пример: операция (!) является логической операцией НЕ, которая возвращает true, если результатом выражения является false и возвращает false, если результатом выражения является true.
Обычно это применяется к переменным типа bool, чтобы проверить, являются ли они true или нет:
If (!isHappy)
std::cout << "I am not happy!\n";
else
std::cout << "I am so happy!\n";
В языке С++ значение 0 обозначает false, а любое другое ненулевое значение обозначает true, поэтому, если логическую операцию (!) применять к целочисленным значениям, то она будет возвращать true, если значением переменной является 0, в противном случае — false.
Следовательно, при работе с классами, операция (!) будет возвращать true, если значением объекта класса является false, 0 или любое другое значение, заданное как дефолтное (по умолчанию) при инициализации, в противном случае — операция (!) будет возвращать false.
В следующем примере мы рассмотрим перегрузку унарной операции минус (−) и операции логического НЕ (!) для класса Something:
#include <iostream>
class Something {
private:
double m_a, m_b, m_c;
public:
Something (double a = 0.0, double b = 0.0, double c = 0.0):
m_a(a), m_b(b), m_c(c) { }
// Конвертируем объект класса Something в отрицательный
Something operator- () const {
return Something (-m_a, -m_b, -m_c);
}
// Возвращаем true, если используются значения по умолчанию, в //противном случае - false
bool operator! () const {
return (m_a == 0.0 && m_b == 0.0 && m_c == 0.0);
}
double getA () {return m_a;}
double getB () {return m_b;}
double getC () {return m_c;}
};
Int main () {
Something something; // используем конструктор по умолчанию //со значениями 0.0, 0.0, 0.0
