C++ Operator Перевантаження прикладами

⚡ Розумний підсумок

Operaперевантаження торів у C++ дозволяє вам перевизначити, як вбудовані оператори, такі як + та ==, працюють з вашими власними класами та об'єктами. Тут ви дізнаєтеся про його синтаксис, підходи, які оператори можна перевантажувати та правила, яких слід дотримуватися.

  • Що це: OperaПеревантаження Tor перевизначає оператори, такі як +, для ваших власних класів.
  • ✍️ Синтаксис: Визначте функцію з іменем оператор, а потім символ, наприклад, оператор+.
  • 🔀 Підходи: Ви можете перевантажувати оператори як функції-члени або дружні функції.
  • 🚫 Обмеження: Деякі оператори, такі як ::, . та ?:, не можна перевантажувати.
  • 🤖 Допомога ШІ: Інструменти штучного інтелекту, такі як GitHub Copilot, миттєво записують функції перевантаження операторів.

C++ Operator Перевантаження

Що таке Operator Перевантаження?

використання перевантаження оператора in C++, ви можете вказати більше ніж одне значення для оператора в одній області. Метою перевантаження оператора є надання спеціального значення оператора для визначеного користувачем типу даних.

За допомогою перевантаження операторів можна перевизначити більшість C++ оператори. Ви також можете використовувати перевантаження операторів для виконання різних операцій за допомогою одного оператора.

синтаксис

Перевантажувати a C++ оператора, ви повинні визначити спеціальну функцію всередині класу наступним чином:

class class_name
{
    ... .. ...
    public
       return_type operator symbol (argument(s))
       {
           ... .. ...
       } 
    ... .. ...
};

Ось пояснення наведеного вище синтаксису:

  • return_type — це тип повернення для функції.
  • Далі ви згадуєте ключове слово operator.
  • Символ позначає символ оператора, який буде перевантажено. Наприклад, +, -, <, ++.
  • Аргумент(и) можна передати операторній функції так само, як і функції.

Приклад 1

#include <iostream>
using namespace std;
class TestClass {
private:
	int count;
public:
	TestClass() : count(5) {}
	void operator --() {
		count = count - 3;
	}
	void Display() { 

		cout << "Count: " << count; }
};

int main() {
	TestClass tc;
	--tc;
	tc.Display();
	return 0;
}

вихід:

 Operator Перевантаження

Ось скріншот коду:

 Operator Перевантаження

Code Пояснення:

  1. Включення файлу заголовка iostream у наш код для використання його функцій.
  2. Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
  3. Створіть клас під назвою TestClass.
  4. Використовуйте модифікатор приватного доступу, який позначає член класу як приватно доступний.
  5. Створіть цілочисельну змінну count. Ця змінна буде приватно доступною.
  6. Використовуйте модифікатор публічного доступу, який позначає член класу як приватно доступний.
  7. Використовуйте конструктор класу, щоб ініціалізувати змінну counter до 5.
  8. Перевантажте значення оператора —.
  9. Оператор зменшить значення змінної x на 1.
  10. Кінець розділу перевантаження операторів. Оператор отримав нову назву.
  11. Визначення функції під назвою Display().
  12. Вивести значення кількості змінних поряд з іншим текстом на консолі під час виклику функції Display(). } позначає кінець тіла функції Display().
  13. Кінець тіла класу.
  14. Виклик функції main(). Логіку програми слід додати в цю функцію.
  15. Створіть екземпляр класу TestClass і назвіть його tc.
  16. Це викличе функцію оператора void –().
  17. Використовуйте позицію класу TestClass для виклику функції Display().
  18. Функція повинна повертати значення після успішного завершення.
  19. Кінець тіла функції main().

Різні підходи до Operator Перевантаження в C++

Ви можете виконати перевантаження оператора, реалізувавши будь-який із таких типів функцій:

  1. Функція члена
  2. Функція не член
  3. Функція друга
  • Функція перевантаження оператора може бути функцією-членом, коли лівий операнд є об’єктом класу.
  • Коли лівий операнд відрізняється, Operaфункція перевантаження tor має бути нечленом.

Ви можете зробити функцію перевантаження оператора функцією друга, якщо їй потрібен доступ до приватних і захищених членів класу.

Можна все C++ Operaбути перевантаженими?

Ні, є C++ оператори, які не можна перевантажувати.

Вони включають в себе:

  • :: -Оператор дозволу області видимості
  • ?: -тернарний оператор.
  • . - селектор членів
  • Оператор sizeof
  • * - селектор вказівника на член

Що потрібно пам'ятати

  1. За допомогою перевантаження оператора ви можете перевизначати спосіб роботи оператора лише для типів, визначених користувачем (об’єктів, структур). Ви не можете використовувати його для вбудованих типів (float, char, int тощо).
  2. = і & C++ оператори перевантажені за замовчуванням. Наприклад, ви можете скопіювати об’єкти одного класу безпосередньо за допомогою оператора =.
  3. Operaпріоритет tor не змінює асоціативності та пріоритету операторів. Однак ви можете змінити порядок оцінювання за допомогою круглих дужок.
  4. Є чотири оператори, які не можна перевантажувати C++. Вони включають оператор розділення області (::), оператор вибору члена (.), вибір елемента через вказівник на оператор функції (.*) і тернарний оператор (?:).

Правила для Operator Перевантаження

Ось правила для Operator Перевантаження:

  • Щоб він працював, принаймні один операнд має бути визначеним користувачем об’єктом класу.
  • Можна лише перевантажувати існуючі оператори. Ви не можете перевантажувати нові оператори.
  • Деякі оператори не можна перевантажувати за допомогою функції друга. Однак такі оператори можуть бути перевантажені за допомогою функції-члена.

Як перевантажити Operaтор

Приклад 1

#include <iostream>   
using namespace std;
class OperatorOverload {
private:
	int x;

public:
	OperatorOverload() : x(10) {}
	void operator ++() {
		x = x + 2;
	}
	void Print() {
		cout << "The Count is: " << x;
		}
};
int main() {
	OperatorOverload ov;
	++ov;   
	ov.Print();
	return 0;
}

вихід:

Перевантаження Operaтор Приклад

Ось скріншот коду:

Перевантаження Operaтор Приклад

Code Пояснення:

  1. Включення файлу заголовка iostream у наш код для використання його функцій.
  2. Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
  3. Створіть клас під назвою OperatorOverload.
  4. Використовуйте модифікатор приватного доступу, який позначає член класу як приватно доступний.
  5. Створіть цілу змінну x. Ця змінна буде приватно доступною.
  6. Використовуйте модифікатор публічного доступу, який позначає член класу як приватно доступний.
  7. Використовуйте конструктор класу, щоб ініціалізувати змінну x до 10.
  8. Перевантажте значення оператора ++.
  9. Оператор збільшить значення змінної x на 2.
  10. Кінець розділу перевантаження операторів. Оператор отримав нову назву.
  11. Виклик функції Print().
  12. Вивести значення змінної x разом із іншим текстом на консолі під час виклику функції Print().
  13. Кінець тіла функції Print().
  14. Кінець тіла класу.
  15. Виклик функції main(). Логіку програми слід додати в цю функцію.
  16. Створіть екземпляр OperatorOverload Клас під назвою ov.
  17. Це викличе функцію оператора void ++().
  18. Використовуйте позицію Operaклас torOverload для виклику функції Print().
  19. Функція повинна повертати значення після успішного завершення.
  20. Кінець тіла функції main().

Приклад 2

#include<iostream> 
using namespace std;

class TestClass {
private:
	int real, over;
public:
	TestClass(int rl = 0, int ov = 0) {
		real = rl;
		over = ov;
	}

	TestClass operator + (TestClass const &obj) {
		TestClass result;
		result.real = real + obj.real;
		result.over = over + obj.over;
		return result;
	}
	void print() {
		cout << real << " + i" << over << endl;
	}
};
int main()
{
	TestClass c1(9, 5), c2(4, 3);
	TestClass c3 = c1 + c2;
	c3.print();
}

вихід:

Перевантаження Operaтор Приклад

Ось скріншот коду:

Перевантаження Operaтор Приклад

Code Пояснення:

  1. Включення файлу заголовка iostream до нашої програми, щоб використовувати його функції.
  2. Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
  3. Створіть клас під назвою TestClass. { позначає початок тіла класу.
  4. Використовуйте модифікатор приватного доступу, щоб позначити змінні як приватні, тобто до них можна отримати доступ лише з класу.
  5. Визначте дві цілі змінні, дійсну та над.
  6. Використовуйте модифікатор публічного доступу, щоб позначити конструктор як публічний, тобто він буде доступний навіть за межами класу.
  7. Створення конструктора класу та ініціалізація змінні.
  8. Ініціалізація значення змінної real.
  9. Ініціалізація значення змінної over.
  10. Кінець корпусу конструктора.
  11. Перевизначте значення оператора +.
  12. Створіть результат типу даних TestClass.
  13. Використовуйте оператор + із комплексними числами. Цей рядок додасть дійсну частину числа до дійсної частини іншого числа.
  14. Використовуйте оператор + із комплексними числами. Цей рядок додасть уявну частину числа до уявної частини іншого числа.
  15. Програма поверне значення змінної результат після успішного виконання.
  16. Кінець визначення нового значення оператора +, тобто перевантаження.
  17. Викличте метод print().
  18. Виведіть нове комплексне число після додавання на консолі.
  19. Кінець тіла функції print().
  20. Кінець тіла класу TestClass.
  21. Виклик функції main().
  22. Передача значень як дійсних, так і комплексних частин, які потрібно додати. Перша частина c1 буде додана до першої частини c2, тобто 9+4. Друга частина c1 буде додана до другої частини c, тобто 5+3.
  23. Виконання операції з використанням перевантаженого оператора + і збереження результату в змінній c3.
  24. Друк значення змінної c3 на консолі.
  25. Кінець тіла функції main().

Поширені запитання

OperaПеревантаження Tor дозволяє вам перевизначити, як вбудовані оператори, такі як + або ==, працюють з об'єктами ваших власних класів, щоб вони поводилися природно для користувацьких типів даних.

Визначте спеціальну функцію, ім'я якої — ключове слово оператор, за яким слідує символ , наприклад, operator+. Вона приймає операнди як параметри та повертає результат.

Існує два основних підходи: перевантаження оператора як функції-члена класу або як дружньої функції, яка може отримувати доступ до закритих членів класу.

Більшість операторів можна перевантажувати, але деякі — ні, зокрема оператори розв'язання області видимості (::), доступу до членів (.), вказівника члена (.*) та тернарного (?:).

Ви можете перевантажувати лише існуючі оператори, принаймні один операнд має бути визначеного користувачем типу, і ви не можете змінювати пріоритет оператора, асоціативність або кількість операндів.

Помічники штучного інтелекту, такі як GitHub Copilot, генерують функції перевантаження операторів для ваших класів, вибирають між функціями-членами та функціями-друзями, а також додають правильні типи повернення під час введення тексту.

Так. Інструменти на базі штучного інтелекту генерують перевантажені оператори, такі як + та ==, дотримуються стандартних правил і позначають оператори, які не можна перевантажити, що заощаджує час і допомагає уникнути помилок.

OperaПеревантаження tor робить класи легшими у використанні та читанні, дозволяючи об'єктам працювати зі знайомими операторами, такими як додавання двох векторів з + замість іменованої функції.

Підсумуйте цей пост за допомогою: