2011-05-13 2 views
1

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

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

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

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

+2

перегруженных оператора может быть статическим в C++. –

+2

И даже если оператор не статичен, не мешает, чтобы каждый объект имел свою собственную копию * кода * –

+0

@Neil: я не сказал, что это не может быть «статическим», все, что я спрашивает, почему компилятор не делает это «статическим», как C# .. – Sherif

ответ

2

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

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

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

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

Почему C# обеспечивает перегрузку оператора как «статического»?
This объясняет это намного лучше, чем я могу.

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

+0

Я реконструировал свой вопрос. – Sherif

1

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

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

Почему C++ не применяет перегруженные операторы к static?

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

+0

Простите, я не понимаю эту часть «асимметрия между аргументами операторов (которая является прямым следствием наличия членских диадических операторов) - плохая идея». – Sherif

+0

@mavric. Часто вы ожидаете, что операторы будут коммутативными, то есть + b эквивалентно b + a. Если один аргумент является особым (объект, для которого вызван член), языковые правила делают сложность для достижения коммутативности. Например, в C++ неявное преобразование не будет доступно. – AProgrammer

+0

Итак, вы говорите, что: компилятор принуждает его быть статичным для обеспечения того, чтобы каждый метод перегрузки оператора возвращал значение, а не просто опрашивал его данные объекта? !! – Sherif

0

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

1

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

Смежные вопросы