如果我这样做:
// In header
class Foo {
void foo(bar*);
};
// In cpp
void Foo::foo(bar* const pBar) {
//Stuff
}
编译器不会提示 Foo::foo 的签名不匹配。但是,如果我有:
void foo(const bar*); //In header
void Foo::foo(bar*) {} //In cpp
代码将无法编译。
这是怎么回事? 我正在使用 gcc 4.1.x
最佳答案
首先,您已向编译器 promise ,但不是该类的其他用户,您不会编辑该变量。
在您的第二个示例中,您已向该类的其他用户 promise 您不会编辑他们的变量,但未能遵守该 promise 。
我还应该注意到两者之间有明显的区别
bar* const variable
和
const bar* variable
和
const bar* const variable
在第一种形式中,指针永远不会改变,但您可以编辑所指向的对象。在第二种形式中,您可以编辑指针(将其指向另一个对象),但不能编辑它指向的变量。在最终形式中,您既不会编辑指针,也不会编辑它指向的对象。 Reference
要对所提出的问题进行更多的澄清,您始终可以 promise 更多的常量而不是更少的常量。给定一个类:
class Foo {
void func1 (int x);
void func2 (int *x);
}
可以编译如下实现:
Foo::func1(const int x) {}
Foo::func2(const int *x) {}
或:
Foo::func1(const int x) {}
Foo::func2(const int* const x) {}
没有任何问题。您已经告诉您的用户您可能会编辑他们的变量。在您的实现中,您已经告诉编译器这个特定的实现不会编辑这些变量,即使告诉用户您可以。您没有违背对用户的 promise ,因此代码可以编译。
关于C++ 常量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269882/