Следует ли использовать const семантически или синтаксически? - PullRequest
2 голосов
/ 06 октября 2011
class A
{
    ...

    public:
        shared_ptr<Logger> GimmeLogger () const
        {
            return m_logger;
        }

    private:
        shared_ptr<Logger> m_logger;
};

В class A, должно GimmeLogger быть const или не- const?

Имеет смысл быть const, потому что этопростой метод получения, который не изменяет *this (синтаксический const).

Но, с другой стороны, он возвращает не const указатель на другой объект, которым он владеет (семантически не *)1016 *).

Ответы [ 4 ]

4 голосов
/ 06 октября 2011

Если вы сделаете это неконстантным, то вы не сможете написать это:

void f(const A & a)
{
    auto v = a.GimmeLogger(); //error
}

Итак, если вы хотите написать это;то есть, если вы хотите вызвать GimmeLogger для константного объекта, то сделайте GimmeLogger константной функцией-членом, потому что вы не можете вызывать неконстантную функцию-член для константного объекта.Однако вы можете вызвать функцию-член const для неконстантного объекта (а также для объекта const).

Внутри функции-члена const каждый член является семантически константными объектами.Таким образом, тип m_logger в функции становится const share_ptr<const m_logger>.Так что измените тип возврата соответственно.

1 голос
/ 06 октября 2011

Как правило, вы не должны возвращать дескриптор данных участника, когда вы можете избежать этого.Постарайся пересмотреть свой дизайн и найти способ обойти это.Тем не менее, если вы должны, это должно быть const.Это позволяет вам вызывать функцию для const объектов, а также неконстантных объектов.См. Например std::string::c_str().Вы также можете перегрузить функцию, чтобы получить и то и другое, как это делают стандартные контейнеры с итераторами.

В случае сомнений поищите подсказку в стандартной библиотеке.

1 голос
/ 06 октября 2011

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

В этом и заключается основная идея ключевого слова mutable: добавление возможности пометить элемент как , что не учитывает видимое состояние объекта , так что синтаксическая проверка соответствуетсмысловой смыслВ вашем конкретном случае, поскольку вы копируете указатель, вам даже не нужно использовать mutable там (на самом деле это одна из слабых сторон правильной константности, так как возвращает неконстантнуюуказатель не вызывает ошибки при компиляции, даже если вы открываете дверь для изменений в вашем объекте)

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

1 голос
/ 06 октября 2011

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

Я понимаю, что вы, но я думаю, что функция остается const в любом случае.

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