Ze
4 / 4 / 0
Регистрация: 30.10.2010
Сообщений: 12
1

Статический оператор "()" в классе

27.09.2012, 12:29. Показов 2730. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья, чем можно объяснить запрет на создание статического "operator ()" в классе?
Связано ли это как-то с его возможностью принимать разное количество параметров (насколько я помню, это же один оператор с таким свойством)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2012, 12:29
Ответы с готовыми решениями:

Статический массив в классе
Необходимо чтобы в классе №1 был динамический массив другого класса №2 типа static чтобы любой...

Как инициализировать статический константный массив в классе?
Например, есть класс, которой статически хранит виды себя. Не могу понять как его инициализировать...

Как инициализировать статический константный массив в классе?
template<typename T>class Logik{public: static bool mr_(T q,T w){...}static bool br_(T q,T...

Как создать в классе статический массив типа string?
Всего есть два класса. Класс Monster имеет поля: enum раса, string имя и int HP. Второй класс...

8
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
27.09.2012, 13:19 2
возможность перегружать операторы была введена для улучшения кода, если правильно это делать он действительно становится проще и понятнее.
некоторые операторы должны быть мемберами классов. это (), [], ->, =, оператор преобразования.
теперь представим, что скажем оператор скобки статический. какой синтаксим вызова будет для него? на сколько он лаконичен прост и понятен?

C++
1
2
3
4
Будет что-нибудь типа:
SomeClass::(arg1, arg2).
чем это лучше в сравнении этим:
SomeClass::Function(arg1, arg2)?
0
Ze
4 / 4 / 0
Регистрация: 30.10.2010
Сообщений: 12
27.09.2012, 15:12  [ТС] 3
Сбил с толку редактор кода VC++.
Выражение
C++
1
2
3
4
struct Type
{
    static int operator ()(Type x, Type y);
};
уже в процессе ввода ругает, тогда как
C++
1
2
3
4
struct Type
{
    static int operator +(Type x, Type y);
};
хочет видеть статическим на этапе компиляции.
Что навело на мысль о том, что это ограничение только на оператор "()".

Добавлено через 16 минут
Также довольно занятно, что несмотря на то что конструкция вне класса вида
C++
1
Type operator =(Type x, Type y);
недопустима,
C++
1
Type operator +=(Type x, Type y);
вполне законна и работает.
Тоже интересно было бы понять причину.

Добавлено через 56 минут
Цитата Сообщение от Ze Посмотреть сообщение
хочет видеть статическим на этапе компиляции.
Пардон, имелось в виду "хочет видеть НЕ статическим".
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.09.2012, 15:53 4
Операторы — это специальные функции, поэтому у них есть специальные ограничения.

Операторы определяются исключительно для объектов классов. Но могут определяться двояко: как метод объекта и как внешний метод. Метод объекта один из операндов (левый) получает неявно через this. Внешнему оба операнда передаются через аргументы.

Статическими они быть не могут. Оператор-метод должен быть нестатическим методом. Внешний оператор должен быть глобальной функцией.

И да, потому что они специальные, волею Господа присваивание нельзя определять внешней функцией. Точно так же нельзя определять [], ->, () и операторы-приведения. Потому что они не имеют смысла без указателя this — для них его надо обязательно передавать, а внешние операторы могут иметь любые типы операндов.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.09.2012, 16:08 5
~OhMyGodSoLong~, Скорее волею Страуструпа все же, ну или волею комитета.)
0
OhMyGodSoLong
27.09.2012, 16:14
  #6

Не по теме:

Не упоминай имя Господа всуе. Чти Святые Писания Его. И ещё 14 заповедей :)

1
Ze
4 / 4 / 0
Регистрация: 30.10.2010
Сообщений: 12
27.09.2012, 16:27  [ТС] 7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
И да, потому что они специальные, волею Господа присваивание нельзя определять внешней функцией. Точно так же нельзя определять [], ->, () и операторы-приведения. Потому что они не имеют смысла без указателя this — для них его надо обязательно передавать, а внешние операторы могут иметь любые типы операндов.
Тут никто не спорит, занятно то, что "=" не может быть, как вы написали "глобальной функцией", а "+=" может.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.09.2012, 17:00 8
А, вы с философской точки зрения. Тут дело, думаю, в том, что присваивание не совсем явно используется много где. Поэтому очень желательно, чтобы оно гарантированно сохраняло свою семантику "присвоить значение какому-то lvalue". += не так часто используется и трактовать можно по разному, поэтому можно допустить всякие вольности.
0
Ze
4 / 4 / 0
Регистрация: 30.10.2010
Сообщений: 12
27.09.2012, 20:13  [ТС] 9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
А, вы с философской точки зрения.
Именно.
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
...присваивание не совсем явно используется много где. Поэтому очень желательно, чтобы оно гарантированно сохраняло свою семантику "присвоить значение какому-то lvalue". += не так часто используется и трактовать можно по разному, поэтому можно допустить всякие вольности.
Возможно именно поэтому, но все-таки идеологически, на мой взгляд, это операторы одной группы и логично было бы им иметь идентичные правила применения.

Добавлено через 1 час 37 минут
Может еще потому что оператор присвоения создается автоматически, даже если не определен вручную, а операторы серии "х=" таким свойством не обладают...

Добавлено через 1 час 27 минут
Да, моя версия такова:
Одна из причин того, что оператор присвоения реализуется только как член класса - дабы компилятор, прочтя определение данного типа, сразу мог определить, требуется ли автоматическое создание оператора присвоения или он определен программистом, в то время как операторы +=, *= и т.п. автоматически не создаются, а посему и проблемы такой нет.
Других причин столь необычного различия ваш покорный слуга пока не видит, возможно из-за некоторых пробелов в знаниях.
0
27.09.2012, 20:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2012, 20:13
Помогаю со студенческими работами здесь

Переопределить оператор << в классе
Добрый день. Не пойму как переопределить оператор &lt;&lt; для моего класса Пробую так #include...

Реализовать оператор индекса в классе
Помогите пожалуйста кто может: Для класса Book реализовать: 1. operator (int idx) который для...

Как перегрузить оператор << в классе?
Всем привет, есть данный код: #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include...

Оператор вывода в производном классе
Как из производного класса вызвать перегруженный оператор вывода из базового класса? Я показал в...

не работает префиксный оператор в классе
Проблема : не работает &quot;++plus&quot; в &quot;void ClassB::count()&quot; Есть вариант решить это так : поменять...

Перегруженный оператор = в классе String
Перегруженный оператор = почему то не работает, не могу разобраться в чем проблема, вроде все норм....

В классе дек неправильно работает оператор +
Я написал класс дек. И вскоре обнаружилась проблема того что оператор + работает не так как надо. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru