Когда перегружать оператор в C++ как член пользовательской структуры данных, а когда нет? Я полностью потерянC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Когда перегружать оператор в C++ как член пользовательской структуры данных, а когда нет? Я полностью потерян

Сообщение Anonymous »


Для любого из вас, кто может помочь мне объяснить, когда и когда не следует перегружать оператор как член класса или структуры, например, или не как член, например глобальный.

Дело в том, что я изучаю все о векторах, трехмерных векторах и т. д. в целях математического обучения и пытаюсь смоделировать с ними общие операции, чтобы лучше понять их поведение при этом.

Итак, я купил книгу, которая слегка затрагивает тот же аспект, что и я, но дошел до той части, где автор книги написал простую векторную структуру на 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; я
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»