4 / 4 / 0
Регистрация: 30.10.2010
Сообщений: 12
|
|
1 | |
Статический оператор "()" в классе27.09.2012, 12:29. Показов 2730. Ответов 8
Метки нет Все метки)
(
Друзья, чем можно объяснить запрет на создание статического "operator ()" в классе?
Связано ли это как-то с его возможностью принимать разное количество параметров (насколько я помню, это же один оператор с таким свойством)?
0
|
|
27.09.2012, 12:29 | |
Ответы с готовыми решениями:
8
Как инициализировать статический константный массив в классе? Как инициализировать статический константный массив в классе?
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
27.09.2012, 13:19 | 2 | |||||
возможность перегружать операторы была введена для улучшения кода, если правильно это делать он действительно становится проще и понятнее.
некоторые операторы должны быть мемберами классов. это (), [], ->, =, оператор преобразования. теперь представим, что скажем оператор скобки статический. какой синтаксим вызова будет для него? на сколько он лаконичен прост и понятен?
0
|
4 / 4 / 0
Регистрация: 30.10.2010
Сообщений: 12
|
|||||||||||||||||||||
27.09.2012, 15:12 [ТС] | 3 | ||||||||||||||||||||
Сбил с толку редактор кода VC++.
Выражение
Что навело на мысль о том, что это ограничение только на оператор "()". Добавлено через 16 минут Также довольно занятно, что несмотря на то что конструкция вне класса вида
Тоже интересно было бы понять причину. Добавлено через 56 минут Пардон, имелось в виду "хочет видеть НЕ статическим".
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
|
4 / 4 / 0
Регистрация: 30.10.2010
Сообщений: 12
|
|
27.09.2012, 16:27 [ТС] | 7 |
Тут никто не спорит, занятно то, что "=" не может быть, как вы написали "глобальной функцией", а "+=" может.
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
27.09.2012, 17:00 | 8 |
А, вы с философской точки зрения. Тут дело, думаю, в том, что присваивание не совсем явно используется много где. Поэтому очень желательно, чтобы оно гарантированно сохраняло свою семантику "присвоить значение какому-то lvalue". += не так часто используется и трактовать можно по разному, поэтому можно допустить всякие вольности.
0
|
4 / 4 / 0
Регистрация: 30.10.2010
Сообщений: 12
|
|
27.09.2012, 20:13 [ТС] | 9 |
Именно.
Возможно именно поэтому, но все-таки идеологически, на мой взгляд, это операторы одной группы и логично было бы им иметь идентичные правила применения. Добавлено через 1 час 37 минут Может еще потому что оператор присвоения создается автоматически, даже если не определен вручную, а операторы серии "х=" таким свойством не обладают... Добавлено через 1 час 27 минут Да, моя версия такова: Одна из причин того, что оператор присвоения реализуется только как член класса - дабы компилятор, прочтя определение данного типа, сразу мог определить, требуется ли автоматическое создание оператора присвоения или он определен программистом, в то время как операторы +=, *= и т.п. автоматически не создаются, а посему и проблемы такой нет. Других причин столь необычного различия ваш покорный слуга пока не видит, возможно из-за некоторых пробелов в знаниях.
0
|
27.09.2012, 20:13 | |
27.09.2012, 20:13 | |
Помогаю со студенческими работами здесь
9
Переопределить оператор << в классе Реализовать оператор индекса в классе Как перегрузить оператор << в классе? Оператор вывода в производном классе не работает префиксный оператор в классе Перегруженный оператор = в классе String В классе дек неправильно работает оператор + Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |