crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> operator QString() const
Litkevich Yuriy
  опции профиля:
сообщение 19.1.2014, 4:08
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


В недрах Qt4 нашёл две непонятные "функции" в классе QUuid:
operator QString() const { return toString(); }

operator GUID() const
{
    GUID guid = { data1, data2, data3,
                    { data4[0], data4[1], data4[2], data4[3],
                      data4[4], data4[5], data4[6], data4[7] }
                };
    return guid;
}


Мне непонятно две 3 вещи:
1) Насколько я знаю в С++ нет возможности создавать собственные операторы, что же это?
2) Почему у оператора не определен тип возвращаемого значения?
3) как их применять?

П.С. пока рыскал по интернету нашёл опус (programmersclub.ru/24/) какого-то оленя (по моему глубокому убеждению):
Цитата
Перегрузка оператора состоит в изменении смысла оператора
я готов убивать за это.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.1.2014, 7:18
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Нашёл!

Форма:
T::operator R();

Означает оператор приведения типа:
(R)
Для определенных пользователем преобразований возвращаемый тип задается неявно и совпадает с именем оператора.

Т.е.
QUuid::operator QString()
для
QString s;
QUuid q;
s = (QString)q;

а
QUuid::operator GUID()
для
GUID w;
QUuid q;
w = (GUID)q;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 20.1.2014, 8:39
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Litkevich Yuriy @ 19.1.2014, 5:08) *
я готов убивать за это.
Ну зачем же так сразу, это в принципе очень даже удобно! :)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.1.2014, 1:20
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ага.

вот как я потерял день копаясь в чужом исходнике:
if ( count == 0) return;
count - по смыслу простой счётчик, но для удобства автора кода имелась перегрузка изменяющая смысл оператора:
bool Foo::operator ==(const Foo &other)
{
    bool res = (this->c == other.c);
    this->c -= 1;
    return res;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 21.1.2014, 11:16
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Нууу, стаким же успехом можно написать и:
#define true false
В таком случае ты можешь еще больше времени потратить. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.1.2014, 18:14
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


бить тяжёлым твёрдым предметом по голове, три раза в день до еды.

Я полностью согласен с Саттером и Александреску:
Правило:
При перегрузке операторов сохраняйте их естественную семантику

Исключения:
В предметной области соглашения о семантике операторов могут существенно отличаться от Си++ (например, при работе с регулярными выражениями, где operator* имеет смысл - "ноль и большее количество").

из Правила №26, "Стандарты программирования на С++" Герб Саттер, Андрей Александреску.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 0:44