В чем смысл таких const
объявлений? const
Меня смущает.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
источник
В чем смысл таких const
объявлений? const
Меня смущает.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
Когда вы добавляете const
ключевое слово к методу, this
указатель по сути становится указателем на const
объект, и поэтому вы не можете изменить какие-либо данные члена. (Если вы не используете mutable
, подробнее об этом позже).
const
Ключевое слово является частью функций подписи , которая означает , что вы можете реализовать два подобных методов, один из которых вызывается , когда объект const
, и тот , который не является.
#include <iostream>
class MyClass
{
private:
int counter;
public:
void Foo()
{
std::cout << "Foo" << std::endl;
}
void Foo() const
{
std::cout << "Foo const" << std::endl;
}
};
int main()
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
}
Это будет выводить
Foo
Foo const
В неконстантном методе вы можете изменить элементы экземпляра, чего нельзя сделать в const
версии. Если вы измените объявление метода в приведенном выше примере на приведенный ниже код, вы получите несколько ошибок.
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
Это не совсем так, потому что вы можете пометить элемент как, mutable
а const
метод может изменить его. В основном он используется для внутренних счетчиков и прочего. Решением для этого будет следующий код.
#include <iostream>
class MyClass
{
private:
mutable int counter;
public:
MyClass() : counter(0) {}
void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; // This works because counter is `mutable`
std::cout << "Foo const" << std::endl;
}
int GetInvocations() const
{
return counter;
}
};
int main(void)
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
std::cout << "Foo has been invoked " << ccc.GetInvocations() << " times" << std::endl;
}
который бы вывел
Foo
Foo const
Foo has been invoked 2 times
Const означает, что метод обещает не изменять ни одного члена класса. Вы сможете выполнить элементы объекта, которые так помечены, даже если сам объект был помечен const
:
const foobar fb;
fb.foo();
было бы законно.
Посмотрите, сколько и как используется «const» в C ++? за дополнительной информацией.
В const
означает классификатор , что методы могут быть вызваны на любое значение foobar
. Разница возникает, когда вы рассматриваете вызов неконстантного метода для константного объекта. Подумайте, имеет ли ваш foobar
тип следующее дополнительное объявление метода:
class foobar {
...
const char* bar();
}
Метод bar()
неконстантный и доступен только из неконстантных значений.
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
Идея const
заключается в том, чтобы пометить методы, которые не изменят внутреннее состояние класса. Это мощная концепция, но на самом деле не применяется в C ++. Это скорее обещание, чем гарантия. И тот, который часто ломается и легко ломается.
foobar& fbNonConst = const_cast<foobar&>(fb1);
const
состоит в том, чтобы пометить методы, которые не изменят внутреннее состояние класса». Это действительно то, что я искал.const
?Это const означает, что компилятор выдаст ошибку, если метод 'с const' изменит внутренние данные.
Тест
Прочитайте это для получения дополнительной информации
источник
const
функциях-членах, в которых не упоминается изменчивость, в лучшем случае неполон.Блэр ответ на вопрос.
Однако обратите внимание, что есть
mutable
спецификатор, который может быть добавлен к членам класса. Любой член, помеченный таким образом, может быть изменен вconst
методе без нарушенияconst
договора.Возможно, вы захотите использовать это (например), если хотите, чтобы объект запоминал, сколько раз вызывался конкретный метод, не влияя на «логическую» константность этого метода.
источник
Значение функции-члена Const в C ++. Общеизвестно: Essential Intermediate Programming дает четкое объяснение:
Итак, в вашем коде:
Вы можете думать так:
источник
this
неconst
. Причина, по которой он не может быть изменен, заключается в том, что это значение.когда вы используете
const
в сигнатуре метода (как ваш сказал:),const char* foo() const;
вы говорите компилятору, что указанная памятьthis
не может быть изменена этим методом (которыйfoo
здесь).источник
Я хотел бы добавить следующий момент.
Вы также можете сделать это
const &
иconst &&
Так,
Не стесняйтесь, чтобы улучшить ответ. Я не эксперт
источник
*this
всегда является lvalue, даже если функция-член имеет квалификацию rvalue-ref и вызывается для rvalue. Пример .СопзИте ключевое слово , используемое с функцией декларация уточняется , что она является функцией члена Const , и он будет не в состоянии изменить элементы данных объекта.
источник
https://isocpp.org/wiki/faq/const-correctness#const-member-fns
источник