Вопрос

Как лучше:

bool MyClass::someQuery() const;

const bool MyClass::someQuery() const;

Я использовал 'const bool', так как я уверен, что помню, что слышал, что это "что делают целые числа" (например,операторы сравнения), но я нигде не могу найти доказательств этого, в основном из-за того, что Google сложно, а Intellisense ничем не помогает;) Может ли кто-нибудь это подтвердить?

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

Это было полезно?

Решение

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

У вас есть копия «Эффективного C ++» Скотта Мейерса? вокруг? Направьте их на пункт 3 (стр. 18 в третьем издании);)

Это дает пример

class Rational {...};
const Rational operator* (const Rational& lhs, const Rational& rhs );

if( (a * b) = c ) // declaring operator *'s return value const causes error to be caught by compiler

Другие советы

Это тот случай, когда const не добавляет значения, но раздувает код и заставляет читателя думать дальше. Какой смысл в этом const ? Вызывающая сторона может скопировать значение в некоторую неконстантную переменную и в любом случае сделать с ней все, что захочет.

Обратите внимание, что if ((a * b) = c) выиграл ' В любом случае t компилировать для встроенных типов, поэтому здесь очень важно, говорим ли мы о встроенных типах (ваш вопрос требует bool ) или пользовательских типах.

Для встроенных типов это не имеет никакого смысла, поэтому его не следует использовать. А что касается пользовательских типов, я нахожусь в лагере Джальфа: что если вызывающая сторона хочет изменить возвращенный объект?

Я не уверен, что if ((a * b) = c) является таким хорошим аргументом для возврата константных пользовательских типов, так как я не могу вспомнить последний раз, когда я ' мы видели, как компилятор not предупреждал об этом.

Чтобы быть немного более конкретным, используйте только "объекты" может быть постоянным Определение в стандарте C ++ «объекта» включает в себя все, на что ссылается lvalue («имеет имя») и временные файлы типа класса. Возвращаемое логическое значение - это значение не относящегося к классу типа, поэтому совместимый со стандартами компилятор будет просто игнорировать " const " в этом случае. Как уже говорили другие, это бесполезно в этом контексте.

Когда вы возвращаете ссылку на переменную-член, имеет смысл сделать ее константой. Здесь вы возвращаете копию, следовательно, нет необходимости в const.

Модификатор const используется только для возвращаемых типов, которые возвращаются по ссылке (либо как ссылка const SomeObject & amp; , либо через указатель < code> const SomeObject * ), поэтому вызывающая сторона не сможет изменить объект с помощью ссылки / указателя. Примитивные типы возвращаются по значению , что означает, что вызывающая сторона получает копию объекта, а не сам объект.

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

Это совершенно неважно. Следовательно, консенсус заключается в возвращении только bool .

Причина, по которой это не имеет значения, заключается в том, что вы все равно не можете вызывать неконстантные функции-члены; bool не является классом или структурой.

Поскольку bool будет скопирован, то же самое, положить const или нет. Кроме того, у вас могут возникнуть проблемы с компиляцией.

константный тип возвращаемого значения

КРАТКОЕ СОДЕРЖАНИЕ:

Значение возвращаемого типа объявленный const не может быть изменен.Этот особенно полезно при ссылка на внутреннее устройство класса, но также может предотвратить более редкие ошибки.

const bool func();
bool f = func();

0 ошибок, 0 предупреждений. Чего вы добились, кроме ненужного взвинчивания кода?

Это древний пост, но я думаю, что стоит упомянуть, что здесь есть потенциальный случай с C ++ 11. Хотя, как утверждают другие, не имеет значения, используете ли вы const bool или bool в качестве типа возврата в большинстве случаев, если вы используете C ++ 11 decltype и партнеры, например result_of вы можете объявить переменную с помощью того же типа, что и возвращаемое значение некоторой функции, поэтому const в этом случае будет иметь эффект.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top