Ну, я знаю функциональность const-члена данных в классе C ++.
Что я хочу знать, так это цель введения в класс константного члена данных. Почему кто-то будет использовать это при написании реального программного обеспечения? Как в действительности используются члены данных const?
Пожалуйста, дайте мне несколько примеров из реальной жизни с причинами.
РЕДАКТИРОВАТЬ :
Я не спрашиваю о static const
элемент данных.
Я прошу несколько реальных случаев использования, где каждый объект будет иметь различное значение const для одних и тех же данных.
Вы бы использовали const
элемент данных по той же причине, что вы использовали бы любой const
объект: для значения, которое может быть произвольно инициализировано, но затем никогда не изменено.
Хорошее практическое правило — обозначать что-то как const
«по умолчанию», так что вы можете представить множество причин использовать его в классе.
class User
{
User(const std::string& name)
: name(name)
{}
private:
/**
* User's name is an invariant for the lifetime of this object.
*/
const std::string name;
};
Можете ли вы оставить const
Вот? Да, конечно. Но тогда вы можете случайно изменить name
когда ты не хотел Вся цель const
это для защиты от таких аварий.
Однако, к сожалению, ваш класс не будет назначаться!
Есть несколько случаев. Наиболее очевидным является статический элемент данных const. Они используются в качестве констант области действия:
class Something {
static const int SOME_CONSTANT = 17;
};
Обратите внимание, что в C ++ 11 и далее constexpr
обычно имеет больше смысла в этих случаях.
Это определяет константу, которая типизируется и ограничивается реализацией класса. Я подозреваю, что это было не то, о чем вы спрашивали.
Более интересный вариант использования — для значений, которые различаются между экземплярами класса, но постоянны на протяжении всего времени жизни класса.
Например, предположим, у вас есть реализация RAID, где конфигурация устанавливает ширину полосы. Вы не знаете ширину полосы во время компиляции, поэтому приведенная выше конструкция вам не поможет. Однако вы хотите, чтобы ширина оставалась постоянной в течение всего времени жизни класса (возможно, ваш код не знает, как обрабатывать изменения ширины полосы).
В этих случаях маркировка значения const и установка его в конструкторе может дать вам гарантию времени компиляции, что никто не изменяет это значение.
Вы используете его точно так же, как вы используете глобально объявленный const, только вы хотите, чтобы он применялся только к классу, в котором вы его определили. Например,
class Character
{
public:
Character()
:
mCurrentHealth{TOTAL_HEALTH},
mCurrentMana{TOTAL_MANA}
{
}
// Define lose/gain health/mana functions
// for mCurrentHealth and mCurrentMana
private:
int mCurrentHealth;
int mCurrentMana;
// Constants
const int TOTAL_HEALTH = 100;
const int TOTAL_MANA = 50;
};
Есть много других примеров, но суть в том, что мы не хотим, чтобы TOTAL_HEALTH и TOTAL_MANA были определены вне класса, потому что они не будут релевантными.