Когда перегружать оператор в C++ как член пользовательской структуры данных, а когда нет? Я полностью потерян ⇐ C++
Когда перегружать оператор в C++ как член пользовательской структуры данных, а когда нет? Я полностью потерян
Для любого из вас, кто может помочь мне объяснить, когда и когда не следует перегружать оператор как член класса или структуры, например, или не как член, например глобальный.
Дело в том, что я изучаю все о векторах, трехмерных векторах и т. д. в целях математического обучения и пытаюсь смоделировать с ними общие операции, чтобы лучше понять их поведение при этом.
Итак, я купил книгу, которая слегка затрагивает тот же аспект, что и я, но дошел до той части, где автор книги написал простую векторную структуру на C++ и получил кучу перегруженных операторов, которые кое-где объявлены и определены внутри структуры, а некоторые нет.
Позвольте мне привести вам именно этот пример, который меня совершенно сбил с толку. В следующем примере будут показаны два разных перегруженных оператора, с помощью которых оба из них выполняют одну и ту же «общую» цель (я думаю?), а именно (векторное/скалярное умножение), однако один из них является членом структуры, а другой нет. нет.
структура Vector3D { плавать x, y, z; Vector3D() = по умолчанию; Vector3D(с плавающей запятой a, с плавающей запятой b, с плавающей запятой c) { х = а; у = б; г = с; } Оператор Vector3D&*=(float s) { х *= с; у *= у; г *= г; возврат (* это); } Оператор Vector3D&/=(float s) { с = 1,0ф/с; х *= с; у *= с; г *= с; возврат (* это); } float& оператор[](int i) { возврат ((&x)); } const float& оператор[](int i) const { возврат ((&x)); } }; встроенный оператор Vector3D*(const Vector3D& v, float s) { return (Vector3D(v.x * s, v.y * s, v.z * s)); } Я конкретно спрашиваю о
Оператор Vector3D&*=(float s) { х *= с; у *= с; г *= с; возврат (* это); } И
встроенный оператор Vector3D*(const Vector3D& v, float s) { return (Vector3D(v.x * s, v.y * s, v.z * s)); } Пожалуйста, если у кого-то есть четкое объяснение, поделитесь им
Я, конечно, попробовал приведенный выше код, чтобы увидеть, какую разницу они имеют, и обнаружил пару вещей, в которых они отличаются:
Когда я пытаюсь распечатать на экране окончательный результат умножения вектора на скаляр (любое число с плавающей запятой) с использованием обоих методов, сразу же будет распечатан только перегруженный член-оператор. Тот, который находится вне структуры, не может быть распечатан, если возврат не назначен другому экземпляру вектора.
Например:
int main() { плавающий с = 2; //Определение скаляра // Вызов первого перегруженного оператора Vector3D vecA (2, 2, 2); векА *= 3; for(int я = 0; я
Для любого из вас, кто может помочь мне объяснить, когда и когда не следует перегружать оператор как член класса или структуры, например, или не как член, например глобальный.
Дело в том, что я изучаю все о векторах, трехмерных векторах и т. д. в целях математического обучения и пытаюсь смоделировать с ними общие операции, чтобы лучше понять их поведение при этом.
Итак, я купил книгу, которая слегка затрагивает тот же аспект, что и я, но дошел до той части, где автор книги написал простую векторную структуру на C++ и получил кучу перегруженных операторов, которые кое-где объявлены и определены внутри структуры, а некоторые нет.
Позвольте мне привести вам именно этот пример, который меня совершенно сбил с толку. В следующем примере будут показаны два разных перегруженных оператора, с помощью которых оба из них выполняют одну и ту же «общую» цель (я думаю?), а именно (векторное/скалярное умножение), однако один из них является членом структуры, а другой нет. нет.
структура Vector3D { плавать x, y, z; Vector3D() = по умолчанию; Vector3D(с плавающей запятой a, с плавающей запятой b, с плавающей запятой c) { х = а; у = б; г = с; } Оператор Vector3D&*=(float s) { х *= с; у *= у; г *= г; возврат (* это); } Оператор Vector3D&/=(float s) { с = 1,0ф/с; х *= с; у *= с; г *= с; возврат (* это); } float& оператор[](int i) { возврат ((&x)); } const float& оператор[](int i) const { возврат ((&x)); } }; встроенный оператор Vector3D*(const Vector3D& v, float s) { return (Vector3D(v.x * s, v.y * s, v.z * s)); } Я конкретно спрашиваю о
Оператор Vector3D&*=(float s) { х *= с; у *= с; г *= с; возврат (* это); } И
встроенный оператор Vector3D*(const Vector3D& v, float s) { return (Vector3D(v.x * s, v.y * s, v.z * s)); } Пожалуйста, если у кого-то есть четкое объяснение, поделитесь им
Я, конечно, попробовал приведенный выше код, чтобы увидеть, какую разницу они имеют, и обнаружил пару вещей, в которых они отличаются:
Когда я пытаюсь распечатать на экране окончательный результат умножения вектора на скаляр (любое число с плавающей запятой) с использованием обоих методов, сразу же будет распечатан только перегруженный член-оператор. Тот, который находится вне структуры, не может быть распечатан, если возврат не назначен другому экземпляру вектора.
Например:
int main() { плавающий с = 2; //Определение скаляра // Вызов первого перегруженного оператора Vector3D vecA (2, 2, 2); векА *= 3; for(int я = 0; я
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как вызвать функцию-член родительской структуры при перегрузке оператора дочерней структуры
Anonymous » » в форуме C++ - 0 Ответы
- 45 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как вызвать функцию-член родительской структуры при перегрузке оператора дочерней структуры
Anonymous » » в форуме C++ - 0 Ответы
- 25 Просмотры
-
Последнее сообщение Anonymous
-
-
-
В чем причина, по которой std :: reference_wrapper не перегружать оператор->?
Anonymous » » в форуме C++ - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
В чем причина, по которой std :: reference_wrapper не перегружать оператор->?
Anonymous » » в форуме C++ - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-