Jonny, ты скорее спрашиваешь про перегрузку операторов и конструкторы копирования(я второй урок ничитал такчто извините если не в тему). Кстати советую перефразировать вопрос потому как давольно тяжело понять его суть.
так вот можно перегрузить операторы стравнений <, >, == и !=
bool operator >(classname &rhs, classname &lhs) в этом случае оператор получает ссылку на левую и правую части выражения и возвращает логическое значение какими критерия оператор пользуется при определении результата уже не важно. Далее при декларации класса нужно указать, что оператор дружественен ему в этом случае оператор получит доступ к скрытым свойствам и методам класса.
При наличии оператора ты можешь использовать объекты как простые переменные встроенных типов. из объявления оператора ты маг заметить что его операнды это выражения стоящие от него слева и справа.
Конструктор копирования необходим для корректного копирования объекта. Например передача объекта функции по значению и операция присваивания. Особенно важен конструктор копирования в случае если объект создаёт для внутренних целей какие-то свои динамические структуры.
Пример:
class X
{
int *px;
X(int init) {px = new int; *px = init;}
~X() {delete px;}
}
void print (X x)
{
printf(“%d\n”*x.px);
}
int main()
{
X x(25); print(x);
X y(16); print(x); print(y);
return 0;
}
Так вот в этот пример будет компилироваться но не будет работать.
Причина довольно банальна, но у меня решения подобной проблемы отняло некоторое время. И так тут при первом вызове функции print вызывается конструктор копирования класса по умолчанию который тупо копирует все данные класса в том числе и значение указателя. Далее при выходе из функции вызывается деструктор класса(чего не случилось бы если передавать ссылку на объект) а деструктор возвращает в кучу область памяти на которую указывает px, но в оригинале объекта указатель всё еще указывает на эту область хотя она уже возвращена куче. И при повторном вызове print(x) происходит обращение к «неизвестной» области памяти.
Вот еще пример с тем же эффектом:
int main()
{
X x(25);
{
X tmp=x;
}
print(x);
return 0;
}
В этом примере переменная tmp уничтожилась при выходи из области видимости {}.
Решается это двумя путями первый передача параметра по ссылке или конструктором копирования.
Вот код конструктора копирования для нашего случая(если я не ошибся с объявлением):
X (X init) { px = new int; px = *init.px;}
Вот так!