我非常熟悉C / C ++标准函数声明。我最近看到过这样的事情:
int myfunction(char parameter) const
以上只是一个假设的例子,我甚至不知道它是否有意义。我指的是参数之后的部分。常数。这是什么?
一个更实际的例子:
wxGridCellCoordsArray GetSelectedCells() const
可以找到here
那么文本const
到底在做什么呢?
答案 0 :(得分:7)
const表示该函数不会更改this
的任何数据成员,除非它们被标记为可变。
只有一个成员函数可以标记为const,这意味着在函数内部不会更改任何成员。
答案 1 :(得分:4)
const关键字在函数后显示时,保证函数调用者不会更改任何成员数据变量。
例如,给出了这个课程,
// In header
class Node {
public:
Node();
void changeValue() const;
~Node();
private:
int value;
};
//在.cpp
中void Node::changeValue() const {
this->value = 3; // This will error out because it is modifying member variables
}
此规则有例外。如果声明成员数据变量是可变的,那么无论函数是否声明为const,都可以更改它。使用mutable是因为对象被声明为常量的罕见情况,但实际上有成员数据变量需要更改选项。其使用的一个潜在示例是缓存您可能不想重复原始计算的值。这通常很少见......但要注意它是很好的。
例如,给出了这个课程,
// In header
class Node {
public:
Node();
void changeValue() const;
~Node();
private:
mutable int value;
};
//在.cpp
中void Node::changeValue() const {
this->value = 3; // This will not error out because value is mutable
}
答案 2 :(得分:4)
这是一种“防御性编程”技术,可以帮助防范您自己的编程错误。使用const
对函数参数,您声明该函数不应该修改该参数,并且添加const
会导致编译器阻止您无意中这样做。类似地,如果你编写一个不应该改变你的类的任何成员变量的成员函数,那么你可以像这样声明整个函数const
,它会阻止你这样做。
它还有助于使您的代码自我记录。将const
添加到参数会告诉用户'此函数不会修改此参数'。将const
添加到成员函数会告诉用户'此函数不会修改类的任何成员'(显式可变的成员除外)。
答案 3 :(得分:2)
方法之后的const
关键字意味着隐式this
参数(设置为用于调用方法的对象的地址)指向常量对象。
在C ++中。成员函数可能如下所示:
class Foo {
int x;
mutable int y;
public:
void bar () {
Foo *me = this; // * this is an implicit parameter
// that points to the instance used
// to call bar()
assert(&x == &this->x); // * accesses to class members are
// implicitly taken from this
x = 1; // * can modify data members
}
void bar () const {
// Foo *me = this; // * error, since "bar() const" means
// this is a "const Foo *"
const Foo *me = this; // * ok
// x = 1; // * error, cannot modify non-mutable
// members of a "const Foo"
y = 0; // * ok, since y is mutable
}
};
C中的模拟分别是访问struct Foo *
和const struct Foo *
的函数:
struct Foo {
int x;
int y;
};
void Foo_bar (Foo *this) { /* ... */ } /* can modify this->x and this->y */
void cFoo_bar (const Foo *this) { /* ... */ } /* cannot modify this->x nor this->y */
C中没有mutable
类似物。