C++ 常量问题

标签 c++ gcc constants

如果我这样做:

// 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/

相关文章:

c - 缓冲区溢出 - linux 64bit

swift - 如果 "static"关键字用于在 swift 中定义常量/不可变,那么 "let"关键字有什么用?

c++ - Operator() 的部分特化

c++ - 如何正确离开临界区?

c - 执行从 x86 程序集编译的程序时出现段错误?

c - 在 GCC 中链接 libssl 和 libcrypto

c++ - const 应该用于捕获错误还是用于文档?

c++ - 我怎样才能安全地将 float *x 变成 const float *const *y?

c++ - 对象指针参数不能使用与对象相同的类中的访问器方法

c++ - 为什么在editBox中使用SetSel和clear函数来写入文本