Перегрузка оператора C ++ - PullRequest
1 голос
/ 13 мая 2011

В C # метод (функция) перегрузки любого оператора должен быть static и public.

Я вижу, что сделать его static - хорошая вещь, каждый объект не нуждаетсяего собственная версия.

Но в C ++ это не обязательно должно быть static.Почему C # обеспечивает это, а C ++ - нет?

Каковы преимущества и недостатки обоих проектов?

Ответы [ 4 ]

2 голосов
/ 13 мая 2011

почему C ++ не устанавливает перегрузку операторов как "статическую"?
Если вы сделаете перегруженную функцию оператора статической, у нее не будет доступа к this.Нужно было бы получить доступ к this внутри перегруженной функции, так как обычно функция изменила бы состояние this.

Вы можете сделать перегруженную операторную функцию static, если вам не нужен доступ к this внутри этой функции, что по сути означает, что вы не манипулируете состоянием объекта, для которого была вызвана операторная функция.,Таким образом, это возможно, но не обычно или по существу желательно.

Создание статически перегруженной операторной функции ограничит область действия операторской функции одним и тем же файлом.

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

почему C # заставляет перегрузку оператора быть "статической"?
Это объясняет это гораздо лучше, чем я.

Каковы преимущества и недостатки?
Ну, ответ на первый вопрос говорит, когда можно сделать перегруженную функцию оператора статичной, и это объясняет преимущества / недостатки.

1 голос
/ 13 мая 2011

Потому что это разные языки. Я действительно не знаю C #, поэтому я не могу комментируйте это слишком много, но в C ++ некоторые операторы, такие как [] и () (не говоря уже об операторе копирования) не может быть статическим, для различные причины. И вообще, почему вы хотите, чтобы оператор был статические? Я не думаю, что когда-либо делал оператор статическим в C ++. классические бинарные арифметические операторы обычно являются свободными функциями, и все остальные члены операторов. (Можно спорить, лучше ли для operator++ быть членом или свободной функцией, но наиболее широко Распространенная практика, кажется, состоит в том, чтобы сделать их членами.)

1 голос
/ 13 мая 2011

Почему C # требует, чтобы перегруженные операторы были static?

Я не из дизайнеров C #. Потенциальная причина заключается в том, что опыт работы с C ++ показал, что наличие асимметрии между аргументами операторов (что является прямым следствием наличия диадических операторов-членов) является плохой идеей.

Почему C ++ не требует, чтобы перегруженные операторы были static?

Потому что предыдущего опыта не было, и это казалось хорошей идеей? (Это различие не имеет смысла в Algol68, одном из немногих языков, предшествовавших C ++, с перегрузкой операторов. Кстати, C ++ не повторял ошибок Algol68 при перегрузке операторов.)

0 голосов
/ 13 мая 2011

Я думаю, что C # применяет это, потому что это имеет смысл, а не то, что это будет неправильно.
Мне было трудно понять параметр this при добавлении 2 объектов, поэтому я думаю, что они применяют его для уменьшения сложности,но все еще нет ничего плохого в том, что операторы нестатичны, просто их легче понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...