Простой вопрос о C++ постоянный синтаксис

Вот некоторый код, скопированный с Размышления в C++ Глава 10 Vol1.

   #include <iostream>
   using namespace std;

   int x = 100;

   class WithStatic {
        static int x;
        static int y;
        public:
             void print() const {
             cout << "WithStatic::x = " << x << endl;
             cout << "WithStatic::y = " << y << endl;
           }
  };

каково значение константы для функциональной печати ()?Спасибо!

5
задан WilliamLou 27 April 2010 в 02:32
поделиться

6 ответов

Я слышал, что это описывалось ранее как «метод, который логически не изменяет объект». Это означает, что, вызывая этот метод, вызывающий может ожидать, что состояние объекта останется прежним после возврата из метода. Фактически, указатель this становится постоянным указателем на постоянный экземпляр этого класса, поэтому переменные-члены не могут быть изменены. Исключением из этого правила являются переменные-члены, объявленные с mutable . Если в классе есть изменяемые переменные-члены, они могут быть изменены как неконстантными, так и константными методами. Кроме того, неконстантные методы нельзя вызывать из константных методов.

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

3
ответ дан 14 December 2019 в 08:45
поделиться

Это означает, что он не изменяет никакие переменные-члены класса.

http://www.parashift.com/c++-faq-lite/const-correctness.html

2
ответ дан 14 December 2019 в 08:45
поделиться

Это гарантия, что функция вообще не будет изменять объект (т.е. это функция «только для чтения»). РЕДАКТИРОВАТЬ: По-видимому, исключение из этого правила - если объект имеет изменяемые члены; они могут быть изменены как константными, так и неконстантными функциями.

Также я рад видеть, что кто-то еще учится у TIC ++. Это отличный ресурс для новичков.

1
ответ дан 14 December 2019 в 08:45
поделиться

Он фактически делает указатель this константным указателем на константу вместо константного указателя на неконстантное. Итак, всякий раз, когда вы ссылаетесь на this в константной функции-члене - явно или неявно - вы используете константный указатель на const.

Итак, в случае класса, который у вас здесь, в любой неконстантной функции тип this равен WithStatic const * , а в константных функциях его тип равно const WithStatic * const .

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

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

переменные-члены могут быть изменены, если они изменяемые или изменчивые , но это более сложные темы, которых, вероятно, лучше избегать, пока вы лучше знакомы с языком. Конечно, обычно вам не нужно о них беспокоиться и не следует использовать их, если в этом нет необходимости. Также можно отказаться от постоянства указателя this , после чего вы можете изменить его, но IIRC, это неопределенное поведение, и это определенно считается плохой идеей.Итак, есть случаи, когда можно изменить состояние объекта в константной функции-члене, но обычно это невозможно, и лучше избегать, даже если это так.

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

1
ответ дан 14 December 2019 в 08:45
поделиться

константа означает, что print () не может изменять переменные состояния, не отмеченные как изменяемые.

-1
ответ дан 14 December 2019 в 08:45
поделиться

Если функция-член объявлена ​​как «const», это означает, что функция не будет изменять состояние объекта. Это:

  • Документирует тот факт, что функция не изменяет состояние (полезно для других разработчиков).
  • Позволяет компилятору выполнять оптимизацию, зная, что результат других «константных» функций не изменится в результате вызова этой функции (что позволяет вывести вызовы функций из циклов).
  • Позволяет вызывать функцию, когда объект передается по константной ссылке, константному указателю и т. Д.

По всем вышеперечисленным причинам следует, как общее практическое правило, объявлять функцию как «константную», если он не изменяет логически состояние объекта. Если логическое состояние объекта меняется, не используйте "const". Кроме того, бывают случаи, когда фактическое состояние изменяется, а логическое - нет (например, кеширование), и в этом случае следует все же пометить функцию как «const», но нужно использовать ключевое слово «mutable» с кешированием. переменные, чтобы сообщить компилятору, что их изменение на самом деле не меняет логического состояния.

1
ответ дан 14 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: