这是从Thinking in C ++ Vol1第10章中复制的一些代码。
#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;
}
};
函数print()的const是什么意思?谢谢!
答案 0 :(得分:3)
我之前听说这是“一种不会在逻辑上改变对象的方法”。这意味着通过调用此方法,调用方可以在方法返回后期望对象的状态保持不变。实际上,this
指针成为指向该类的常量实例的常量指针,因此不能更改成员变量。此规则的例外是成员变量是使用mutable
声明的。如果一个类有mutable
个成员变量,那么这些变量可以通过非const和const方法进行修改。此外,不能从const方法中调用非const方法。
有些人使用mutable
成员变量来缓存及时计算的结果。理论上,对象的状态不会改变(即唯一的影响是后续调用更快,但是在给定相同输入的情况下它们会产生相同的结果)。
答案 1 :(得分:2)
这意味着它不会更改类的任何成员变量。
http://www.parashift.com/c++-faq-lite/const-correctness.html
答案 2 :(得分:1)
保证函数根本不会修改对象(即它是“只读”函数)。编辑:显然,该规则的例外是对象有mutable
个成员;那些可以通过const和非const函数来改变。
另外,我很高兴看到其他人从TIC ++学习。这对初学者来说是一个很好的资源。
答案 3 :(得分:1)
它的作用是有效地使this
指针成为const的const指针,而不是指向非const的const指针。所以,只要你在const成员函数中引用this
- 无论是显式还是隐式 - 你都使用const指针指向const。
所以,对于你在这里的类,在任何非const函数中,this
的类型是WithStatic const *
,而在const函数中,它的类型是const WithStatic * const
与任何指向const的指针一样,你不能改变它所指向的任何东西。因此,您不能更改其任何成员变量,也不能调用其任何非const成员函数。
一般来说,如果你能合理地将成员函数设为const是个好主意,因为它保证你不会改变对象的状态,你可以用const对象来调用它。 / p>
如果成员变量是mutable
或volatile
, 可能会被更改,但这些更高级的主题可能会更好地避免,直到你成为更熟悉这门语言。当然,你通常不需要担心它们,除非你需要,否则不应该使用它们。也可以抛弃this
指针的常量,此时你可以改变它,但IIRC,那是未定义的行为,而且它通常被认为是一个坏主意。因此,有些情况下可以在const成员函数中更改对象的状态,但通常不可能并且最好避免使用它。
当你创建一个成员函数const时,你有效地承诺该函数调用不会改变对象的状态(尽管显然可能存在副作用,因为你可以调用像{{1这样的函数这样的事实}})。
答案 4 :(得分:1)
如果成员函数声明为“const”,则表示该函数不会修改对象的状态。这样:
由于上述所有原因,作为一般经验法则,如果它不逻辑地修改对象的状态,则应该将函数声明为“const”。如果对象的逻辑状态发生变化,则不要使用“const”。顺便说一下,有些情况下实际状态会发生变化,但逻辑状态却没有(例如缓存),在这种情况下,仍然应该将函数标记为“const”,但是需要在缓存中使用“mutable”关键字变量,以告诉编译器修改它们实际上不会改变逻辑状态。
答案 5 :(得分:0)
直观地说,这意味着该方法不会修改调用它的对象。但实际上,这意味着两件事:
const
的对象或对象指针上调用该方法。this
指针变为const
。因此,所有成员(声明为mutable
的成员除外)都是const
,即在方法的上下文中是只读的。但是,它仍然可以修改:
this
指针访问的数据 - 包括全局数据,方法参数指向的数据,类的静态成员,类的其他对象,甚至同一个对象(如果碰巧有访问非const指针或使用const_cast
绕过常量。答案 6 :(得分:-1)
const表示不允许print()修改未标记为mutable的状态变量。