Широко используемый 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. До скорой встречи!