C++ const问题

ani*_*nio 8 c++ gcc const

如果我这样做:

// In header 
class Foo {
void foo(bar*);
};

// In cpp
void Foo::foo(bar* const pBar) {
//Stuff
}
Run Code Online (Sandbox Code Playgroud)

编译器不会抱怨Foo :: foo的签名不匹配.但是如果我有:

void foo(const bar*); //In header
void Foo::foo(bar*) {} //In cpp
Run Code Online (Sandbox Code Playgroud)

代码将无法编译.

到底是怎么回事?我正在使用gcc 4.1.x.

Dou*_*yle 15

在第一个中,您已经承诺了编译器,但不承诺该类的其他用户不会编辑变量.

在您的第二个示例中,您已经向该类的其他用户承诺您不会编辑他们的变量,但却未能履行该承诺.

我还应该注意到,两者之间存在明显的差异

bar* const variable
Run Code Online (Sandbox Code Playgroud)

const bar* variable
Run Code Online (Sandbox Code Playgroud)

const bar* const variable
Run Code Online (Sandbox Code Playgroud)

在第一种形式中,指针永远不会改变,但您可以编辑指向的对象.在第二种形式中,您可以编辑指针(将其指向另一个对象),但不要编辑它指向的变量.在最终形式中,既不会编辑指针,也不会编辑它指向的对象.参考

为了对所述问题添加更多澄清,您可以始终承诺更多const而不是更少.给出一个类:

class Foo {
    void func1 (int x);
    void func2 (int *x);
}
Run Code Online (Sandbox Code Playgroud)

您可以编译以下实现:

Foo::func1(const int x) {}
Foo::func2(const int *x) {}
Run Code Online (Sandbox Code Playgroud)

要么:

Foo::func1(const int x) {}
Foo::func2(const int* const x) {}
Run Code Online (Sandbox Code Playgroud)

没有任何问题.您已告诉用户您可能会编辑他们的变量.在您的实现中,您告诉编译器这个特定的实现不会编辑这些变量,即使告诉用户您可能.您没有违反对用户的承诺,因此代码编译.


Gre*_*ers 6

看到这个问题,这个问题这个问题.

基本上,const只表示该函数不会修改指针的值.指针内容不是const,与标题的签名相同.


Dus*_*ell 2

第一个示例中的 const关键字没有意义。您是说您不打算更改指针。但是,指针是按值传递的,因此更改与否并不重要;它不会影响调用者。同样,你也可以这样做:

// In header 
class Foo {
void foo( int b );
};

// In cpp
void Foo::foo( const int b ) {
//Stuff
}
Run Code Online (Sandbox Code Playgroud)

你甚至可以这样做:

// In header 
class Foo {
void foo( const int b );
};

// In cpp
void Foo::foo( int b ) {
//Stuff
}
Run Code Online (Sandbox Code Playgroud)

由于int是按值传递的,因此常量并不重要。

在第二个示例中,您说您的函数采用指向一种类型的指针,但随后将其实现为采用指向另一种类型的指针,因此它失败。