Какова семантика функции-члена const?

13
задан Ferruccio 19 September 2008 в 01:38
поделиться

9 ответов

const о семантике программы а не о деталях реализации. Необходимо отметить функцию членства const, когда она не изменяет видимое состояние объекта и должна быть вызываемой на объекте, который является самостоятельно const. В const функция членства на классе X, тип this X const *: указатель на постоянный X объект. Таким образом все членские переменные эффективно const в той функции членства (кроме [1 110]). Если Вы имеете const объект, можно только звонить const функции членства на нем.

можно использовать mutable, чтобы указать, что членская переменная может измениться даже в const функция членства. Это обычно используется для идентификации переменных, используемых для кэширования результатов, или для переменных, которые не влияют на фактическое заметное состояние, такое как взаимные исключения (все еще необходимо заблокировать взаимное исключение в эти const функции членства), или счетчики использования.

class X
{
    int data;
    mutable boost::mutex m;
public:
    void set_data(int i)
    {
        boost::lock_guard<boost::mutex> lk(m);
        data=i;
    }
    int get_data() const // we want to be able to get the data on a const object
    {
        boost::lock_guard<boost::mutex> lk(m); // this requires m to be non-const
        return data;
    }
};

при содержании данных указателем, а не непосредственно (включая интеллектуальные указатели такой как [1 116] или boost::shared_ptr) тогда указатель становится const в const функция членства, но не указанный данные, таким образом, можно изменить указанный данные.

Что касается кэширования: в целом компилятор не может сделать этого, потому что состояние могло бы измениться между вызовами (особенно в моем многопоточном примере со взаимным исключением). Однако, если определение встроено тогда, компилятор может вытянуть код в вызов, функционируют и оптимизируют то, что это видит там. Это могло бы привести к функции эффективно только быть названным однажды.

следующая версия Стандарт C++ (C++ 0x) будет иметь новое ключевое слово constexpr. Функции отметили constexpr, возвращают постоянную величину, таким образом, результаты могут кэшироваться. Существуют пределы на то, что можно сделать в такой функции (чтобы компилятор мог проверить этот факт).

24
ответ дан Anthony Williams 19 September 2008 в 01:38
поделиться

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

class Foo
{
public:
    int bar() const
    {
        static int x = 0;
        return x++;
    }
};
0
ответ дан Andrew Medico 19 September 2008 в 01:38
поделиться
  • 1
    Вы правы, это - совпадение, при тестировании я создал файлы в лексическом порядке (file1, file2, file3), таким образом, inodes естественно будет в том же порядке. – Matthew Ife 5 February 2014 в 10:13

Ключевое слово , изменяемое на членских переменных, позволяет, чтобы функции константы изменили состояние объекта под рукой.

И не, это не делает данных кэша (по крайней мере, не все вызовы), так как следующий код является допустимой функцией константы, которая изменяется со временем:

int something() const { return m_pSomeObject->NextValue(); }

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

Однако я не могу ответить, как компилятор работает с методами константы. Я услышал, что это может оптимизировать определенные вещи, хотя я должен был бы искать его, чтобы быть бесспорным.

3
ответ дан Statement 19 September 2008 в 01:38
поделиться
  • 1
    И терминал был любым другим tty/vdu, который был включен в машину. Как указано консоль была " special" поскольку это было то, используемое для запуска и завершения работы. – Brad Lanam 9 January 2014 в 17:58

В этом контексте const функция членства означает, что this рассматривается как const указатель также. На практике это означает, что Нельзя изменить состояние this внутренняя часть const функция членства.

Для функций без побочных эффектов (т.е. чего Вы пытаетесь достигнуть), GCC имеет "функциональный атрибут", названный pure (Вы используете его путем высказывания __attribute__((pure))): http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

2
ответ дан Chris Jester-Young 19 September 2008 в 01:38
поделиться
  • 1
    Спасибо! Я can' t схватывают одну вещь. После сортировки мы все еще удаляем файлы один за другим, таким образом, это - все еще произвольный доступ (просто предполагающий). Как файловая система может получить преимущество получения файлов для удаления в порядке, если те файлы отправляются в него для удаления отдельно? – ovgolovin 19 August 2013 в 05:51

Вдобавок к тому, что функция членства может изменить глобальные данные, для функции членства возможно изменить явно объявленных изменяемых членов рассматриваемого объекта.

0
ответ дан KTC 19 September 2008 в 01:38
поделиться
  • 1
    Если я понимаю вещи право, ОС должна сначала удалить файл из каталога, и затем отметить inodes как пустой. Это должно привести к тому, чтобы двигать головой жесткого диска между ними папку и inode структуры для единственного файла. Будет Linux быть в состоянии к пакетным удалениям нескольких файлов таким способом как для создания преимущества последовательного inode, заказывающего (кажется, что это это должно сначала быть сделано с папками и затем обновить inodes в пакете для всех тех файлов). – ovgolovin 20 August 2013 в 05:27

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

2
ответ дан Corey Ross 19 September 2008 в 01:38
поделиться
  • 1
    @V0R73X: что Вы подразумеваете под программой командной строки? Любая программа может быть запущена от командной строки, и консольная программа может быть запущена от Windows Explorer. – cdarke 10 January 2014 в 13:28

Я сомневаюсь относительно него, функция могла все еще вызвать глобальную функцию, которая изменила состояние мира, и не нарушают константу

0
ответ дан 1800 INFORMATION 19 September 2008 в 01:38
поделиться
  • 1
    I' d говорят it' s последовательный, потому что слой блока Linux объединяется рядом с запросами от слоя файловой системы прежде, чем поразить вращающиеся медиа. Как Вы знаете, расцепляете (2), не вытирает целый файл, но отмечает их " deleted" в файловой системе. Те метки, включая указатели блока, очень друг близко к другу. Дело в том, что, потому что мы говорим об очень очень большом каталоге, существует огромное количество тех меток, которое занимает большое место. Доступ к пространству случайным образом не дает слою блока шанса объединить запросы и вызвать главные издержки по сравнению с последовательным объединенным доступом. – Yasushi Shoji 19 August 2013 в 08:22

Corey корректен, но примите во внимание, что любые членские переменные, которые отмечены как изменяемый , могут быть измененными в функциях членства константы.

Это также означает, что эти функции могут быть вызваны от других функций константы, или через другие ссылки константы.

<час>

Редактирование: Прокляните, был разбит на 9 секунд.... 9!!!:)

0
ответ дан OJ. 19 September 2008 в 01:38
поделиться
  • 1
    Не то, чтобы я знаю о. Системный вызов Unix/Posix/Linux, я предполагаю, разработанный, чтобы быть простым. Удаление dir не всегда удаляет файлы в нем; существует вещь, названная " твердый link". Так, даже у Вас есть такой syscall, он должен проверить inodes один за другим так или иначе. – Yasushi Shoji 20 August 2013 в 10:38

Нет.

метод константы А является методом, который не изменяет состояние объекта (т.е. его поля), но Вы не можете предположить, что, учитывая тот же вход, возвращаемое значение метода константы определяется. Другими словами, const ключевое слово НЕ подразумевает, что функция является непосредственной. Например, метод, который возвращает текущее время, является методом константы, но его возвращаемое значение изменяется между вызовами.

3
ответ дан blackwing 19 September 2008 в 01:38
поделиться
  • 1
    Что относительно терминала? Кроме того, в Windows мы можем сказать, что консольная программа совпадает с программой командной строки? И просто использует термин Консоль, не делая его прилагательным к " Program" имейте в виду консольную программу, или это имело бы ее собственное различное значение? – dsynkd 9 January 2014 в 20:26
Другие вопросы по тегам:

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