Широко используемый C++ для СТРУКТУРЫ ДАННЫХ Часть 2

Перегрузка оператора

В C++ мы можем вкладывать разные значения в такие операторы, как «+, -, % ..», и это очень полезно, когда мы хотим добавить разные объекты. Например, при перегрузке оператора мы можем добавить не только «2+3=5», но и «красный+синий=фиолетовый», или «молоко+кофе=латте», или «a(2,3,4) + b(5). ,6,7) = c{2,3,4,5,6,7} или все, что мы можем придумать, возможно. Это можно сделать, превратив оператор в тип функции, называемый «функция оператора».

Существует два способа реализации операторной функции.1. Реализуйте как внешнюю функцию и объявите в классе как *другую функцию. 2. Реализовать как функцию-член класса (более предпочтительный способ).

//operator function type
return-type operator+(parameter lists);

*friend function: внешняя функция, которая не включена в качестве функции-члена класса. (блуждающая функция, не входящая в определенный класс)

с = а + б; (+ перегрузка оператора)

В структуре данных 'Love(int kiss=0; int Hug=0) : kiss(kiss), Hug(Hug) {}'является универсальным способом объявить функция. (помните, как упростить функцию в одну строку с перегрузкой и параметром по умолчанию)

Теперь мы можем добавить два объекта Love с оператором Love, который мы определили. Ниже приведен более подробный пример.

Или мы можем написать операторную функцию, чтобы добавить два объекта Love с внешней функцией и объявить их как функцию друга.

с = а + б; (++ перегрузка оператора)

class Love {
  int kiss;
  int hug;
public:
...
  Love operator+(Love op2);
};
Love Love::operator(Love op2) {
  Love tmp;
  tmp.kiss = this->kiss + op2.kiss;
  tmp.hug = this->hug + op2.hug
  return tmp;
}
int main() {
  Love a(1, 10), b(10,6), c;
  c = a + b;
  c.show() //kiss=11, hug=16
}

с = а += б; (+= перегрузка оператора)

class Love {
...
public:
  Love operator+ (Love op2);
}
Love Love::operator+=(Love op2) {
  kiss = kiss + op2.kiss;
  hug = hug + op2.hug;
  return *this; //attention!
}
int main() {
  Love a(1,10), b(10,6), c;
  c = a += b;
  a.show(); //kiss=11, hug=16
  c.show(); //kiss=11, hug=16
}

++a (перегрузка префиксного оператора)

class Love {
...
public:
  Love operator++();
};
Love Love::operator++() {
  kiss++;
  hug++;
  return *this; //return changed object itself
}
int main() {
  Love a(1,10), b;
  a.show(); //kiss=1, hug=10
  b.show(); //kiss=0, hug=0
  b = ++a;
  a.show(); //kiss=2, hug=11
}

a++ (перегрузка постфиксного оператора)

class Love {
...
public:
  Love operator++(int x); //parameter
};
Love Love::operator++(int x){
  Love tmp = *this; //save before the change
  kiss++;
  hug++;
  return tmp; //return before the change
}
int main() {
  Love a(1,10), b;
  b = a++; //postfix operator
  a.show(); //kiss=2, hug=11
  b.show(); //kiss=1, hug=10

Что, если мы напишем с функцией друга?

//prefix operator ++a
Love operator++(Love& op) {
  op.kiss++;
  op.hug++;
  return op;
}
//postfix operator a++
Love operator++(Love& op, int x) {
  Love tmp = op;
  op.kiss++;
  op.hug++;
  return tmp;
}

‹‹ и ›› перегрузка оператора

ostream& operator<<(const char *);
ostream& operator<<(char);
ostream& operator<<(short);
ostream& operator<<(int);
ostream& operator<<(long);
ostream& operator<<(float);
ostream& operator<<(double);
...

Причина, по которой оператор ‹‹ печатает любой операнд, будь то int или указатель, заключается в том, что класс-член ostream внутри объекта cout содержит множество перегруженных функций оператора ‹‹. Точно так же мы можем определить другую операторную функцию ‹‹, которая также может печатать тип объекта.

Константный объект и функция-член

Помните, что, указав ключевое слово const, вы не можете произвольно изменять значение. (const double PI = 3.14) Что, если я поставлю ключевое слово const после функции?

Если функция-член является константной функцией, ключевое слово const после объявления функции означает, что вы можете читать, но не можете изменять переменные-члены. Это предотвращает изменение переменных-членов функцией, но вызов значения по-прежнему разрешен. Вот почему константная функция-член называется, другими словами, инспектором. (неконстантная функция-член называется мутатором)

Если const находится перед объектом

  • ни одна из переменных-членов не может изменяться
  • разрешено вызывать только функцию-член с ключевым словом const (Cir.GetArea() o / Cir.SetRadius() x)

Шаблон

Перезапись одного и того же кода только с разными типами параметров может быть пустой тратой времени.

void swap(int& a, int& b) {
  int tmp;
  tmp = a;
  a = b;
  b = tmp;
}
void swap(double& a, double& b) {
  int tmp;
  tmp = a;
  a = b;
  b = tmp;
}
... //waste!

Вместо этого использование шаблона можетобобщить функцию или класс, который имеет тот же код, но только разные переменные или параметры. Это называется общее программирование. STL — одна из успешных библиотек, ориентированная на универсальное программирование. Общее программирование ориентировано на работу с различными типами данных с помощью одного алгоритма и направлено на написание одного кода независимо от типа данных.

template <class T> //or
template <typename T> //for declaring template

Из универсальной функции создаются указанные функции, как показано в примерах ниже.

#include <iostream>
using namespace std;
class Coffee {
int shot;
public:
  Coffee(int shot=1) { this->shot=shot; }
  int getShots() { return shot; }
};
template <class T>
void myswap(T & a, T & b) {
  T tmp;
  tmp = a;
  a = b;
  b = tmp;
}
int main() {
  Coffee espresso(1), doubleshot(2);
  myswap(espresso, doubleshot);
  cout<<espresso.getShots()<<endl; //2
  cout<<doubleshot.getShots()<<endl; //1
}

Шаблон класса

Стек — это одна из структур данных, в которой последние данные выводятся первыми (Last In First Out; LIFO). Давайте создадим собственный класс стека, используя переменную-член шаблона.

Когда я хочу построить класс как шаблон, сделайте его с переменной-членом. (T data[100]) MyStack‹T›::functionName(); буду работать. Между тем, переменная tos не обязательно должна быть универсального типа T, поскольку она является индексом. (тип int разумен)

Это базовый C++, который я изучил в колледже, прежде чем приступить к работе со структурой данных. Следующая публикация будет последней частью базового C++: STL. До скорой встречи!