Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Зачем в С++ перед постоянной переменной писать const? Есть какие то случаи, когда это спасёт её от изменения значения?

ахахахах ахахахах Мастер (2310), открыт 1 неделю назад
6 ответов
wda wdas Мастер (1956) 1 неделю назад
Постоянно писать не надо, а только у тех значений которые изменятся не будут. Другой видит, что const pi и понимает, что ты не будешь эту переменную изменять
Joycelyn Yetter Профи (926) 1 неделю назад
Ключевое слово const перед переменной в C++ указывает на то, что значение переменной не может быть изменено после инициализации. Это помогает предотвратить случайные изменения значения переменной и обеспечивает безопасность программы.
ахахахах ахахахахМастер (2310) 1 неделю назад
спасибо, понял
Иван Агафонов Мастер (1715) 1 неделю назад
Для облегчения работы компилятору. Определить переменную в инициализированный или нет - Сегмент.
Егор Падерин Мастер (1381) 1 неделю назад
Ну как известно, константу нельзя изменить, это может помочь с оптимизацией кода, т.к. если значение известно заранее(присвоили еще на этапе компиляции, например const double pi = 3.14159265/constexpr double pi = 3.14159265), то компилятор везде в коде может подставить это значение, избежав хранения лишней переменной, т.к. она уже будет подставлена везде в коде и смысла в ней нету. Такие константы, которые известны еще на этапе написания кода называют константой времени компиляции, их обычно записывают constexpr, еще constexpr может быть сравнение, например
#include <iostream>

template <typename T>
void JustAFunction(const T &value) {
if constexpr(std::is_same_v<T, double>) {
std::cout << "double" << std::endl;
} else {
std::cout << "something else" << std::endl;
}
}

int main() {
double a;
int b;
JustAFunction(a);
JustAFunction(b);
return 0;
}

на этапе компиляции компилятор просто подставит нужные типы переменных в сравнение и выберет лишь одну ветку, это позволяет избежать компиляции нескольких веток if, оставляя кусок кода, который будет выполнен в любом случае. Как то так. Ну а const просто дает неизменяемость переменной, ну и если это тоже известное значение еще на этапе компиляции, то тоже подставляется. Ну и в аргументах функции const позволяет хранить временные объекты, например функция принимает аргумент string, разумно принимать строку по ссылке, но временная строка не примется в таком случае, но если принимать аргумент через константную ссылку, то временная строка примется(SomeKindOfFunction("just a string");) как то так получается, надеюсь нормально объяснил, у меня никогда не получается должным образом объяснить
ахахахах ахахахахМастер (2310) 1 неделю назад
спасибо
Николай Веселуха Высший разум (381984) 1 неделю назад
 #include <iostream> 
using namespace std;
int main() {
const auto x{ 25 };
cout << "x: " << x << '\n';
auto px = &x;
cout << "px: " << *px << '\n';
auto ppx = const_cast<int*>(px);
cout << "ppx: " << *ppx << '\n';
*ppx *= 2;
cout << "ppx: " << *ppx << '\n';
cout << "px: " << *px << '\n';
cout << "x: " << x << '\n';
}
Moon Late Гуру (3816) 1 неделю назад
Более того, const-переменная по-особому обрабатывается компилятором. Её значение может быть включено в состав машинной инструкции, если компилятор посчитает это возможным. Так же, квалификатор const влияет на размещение этой переменной в памяти.
Так же, есть некоторые требования со стороны языка по наличию квалификаторов const. Например,
 class A {
public:
int getA() const;
private:
int a;
 class A {
public:
int operator +(const A& other) const;
...
А еще есть такая штука, как constexpr - выражения, вычисляемые во время компиляции. Например:
 constexpr int Sum(int a, int b) { return a + b; }
constexpr int result = Sum(40, 100);
здесь значение constexpr-переменной result будет посчитано во время компиляции и не будет иметь в коде вызова ф-ции Sum.

И еще есть if constexpr:
 const int a = 50;
if constexpr (a == 50)
...
else if constexpr (a == 60)
...
в этом случае const int a вообще не отражается в коде, это константа компиляции. В зависимости от условий if constexpr будет скомпилирован тот или другой код. Активно применяется в метапрограммировании с шаблонами.
Похожие вопросы