2010-06-29 2 views
378

Можно создать дубликат:
Meaning of “const” last in a C++ method declaration?Что означает «const» в конце объявления функции?

Привет Я получил книгу, где написано что-то вроде:

class Foo 
{ 
public: 
    int Bar(int random_arg) const 
    { 
     // code 
    } 
}; 

Кроме того, бай-зе-полосная вопрос : почему мне/не следует использовать const перед объявлениями аргументов? Что это изменит?

int Foo (const int Bar) { /* code */ } 

EDIT: Так что, если я сейчас:

Foo v1, v2; 

Будет (Уст-меченый) функция Bar существует 3 раза или 1 раз в памяти?

+1

Дубликат http://stackoverflow.com/questions/751681/meaning-of-const-last-in-ac-method-declaration –

+5

Он изменяет тип 'this' из' Foo * const' в 'const Foo * const'. Это имеет последствия. – sbi

+0

Я не понимаю ваши изменения. Что именно вы хотите знать? Если объявление двух переменных типа Foo создаст несколько экземпляров функций Bar? –

ответ

663

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

Другой способ мышления о такой «const-функции» - это просмотр функции класса как нормальной функции с использованием неявного указателя this. Таким образом, метод int Foo::Bar(int random_arg) (без константы в конце) приводит к такой функции, как int Foo_Bar(Foo* this, int random_arg), и вызов, такой как Foo f; f.Bar(4), будет внутренне соответствовать чем-то вроде Foo f; Foo_Bar(&f, 4). Теперь добавление константы в конец (int Foo::Bar(int random_arg) const) можно затем понимать как объявление с константой этого указателя: int Foo_Bar(const Foo* this, int random_arg). Так как тип this в этом случае является const, модификации переменных-членов не возможны.

Можно отменить ограничение «const function», не позволяющее функции писать любой переменной класса. Чтобы позволить некоторым из переменных записываться, даже если функция помечена как «функция const», эти переменные класса помечены ключевым словом mutable. Таким образом, если переменная класса помечена как изменяемая, а «const function» записывает в эту переменную, тогда код будет компилироваться чисто, и переменную можно изменить. (C++ 11)

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

Const correctness

The C++ 'const' Declaration: Why & How

+1

@ereOn, если вам понравилось mutable, вам может понравиться это. Наиболее распространенный прецедент для «mutable» является модификатором для мьютекса, контролирующего доступ к экземпляру класса. Просто потому, что вы обещаете не изменять экземпляр, это не означает, что то, что вы читаете от него, не будет изменено кем-то, у которого есть неконстантная ссылка на него. –

+1

@Janick, я изучаю C++ сам в течение года или двух, никогда не вижу, чтобы какие-либо книги охватывали такое объяснение, и я чувствую, что это действительно полезно. Какие типы книг я должен прочитать, чтобы изучить эти вещи, подобные этому, скрывать этот указатель. – Steven

+1

@Steven: Я думаю, что самой полезной вещью может быть на самом деле прочитать C-книгу и то, как некоторые OO-подобные вещи могут быть реализованы на простом C. Из этого легче видеть, как карты COS для родных OO-карт отображаются на более низком уровне конструкции в C и, в конечном счете, вплоть до машины. –

7

Подобный this вопрос.

По существу это означает, что метод Bar не будет изменять переменные mutable, принадлежащие Foo.

9

Bar гарантирует, что не будет изменен объект, на который он вызывается. См., Например, section about const correctness в C++ FAQ.

+8

Не забывайте про ключевое слово 'mutable'. –

6

Мне всегда кажется, что концептуально легче думать о том, что вы создаете этот указатель const (что в значительной степени то, что он делает).

+2

Собственно, не сам указатель' this' является 'const', а то, на что он указывает, т.е.' * this';) – fredoverflow

29

Рассмотрим два класса типизированных переменных:

class Boo { ... }; 

Boo b0;  // mutable object 
const Boo b1; // non-mutable object 

Теперь вы можете вызвать любую функцию члены Boo на b0, но только const -qualified функции-члены на b1.

6

Функция не может изменить свои параметры с помощью указателя/ссылки, которую вы ему дали.

Я иду на эту страницу каждый раз, когда мне нужно думать об этом:

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

Я считаю, что есть также хорошая глава в Мейерсе более эффективных C++ ".

Смежные вопросы