代码先行:
class A
{
public:
...
int *foo() const
{
return _px;
}
private:
int *_px;
}
成员函数
foo
返回一个指向private
成员_px
的非常量指针,我认为这为修改成员_px
打开了一扇门,对吧?
foo
是const
成员函数吗?我应该在返回类型前面添加 const
吗?
更新
const 成员函数应该保证的是,它不能更改任何数据成员,对吧?
就我而言,函数
foo
并没有打开修改class A
的数据成员_px
的大门,而是修改_px
指向的内容,所以我的问题是,这是否违反了const-function 应该保证吗?
const
成员函数只能返回const
指针或对成员的引用。
但是,您的示例并没有返回指向成员的指针;而是返回了指向成员的指针。它返回一个恰好是指针的成员的副本。这在
const
成员函数中是允许的(即使指针碰巧指向另一个成员)。
这是不允许的(请注意,它现在返回一个引用):
int *& foo() const {return _px;}
但这会(返回
const
参考):
int * const & foo() const {return _px;}
int *_px
变为 int *const _px
,这意味着指针无法重新定位,但指向的数据仍然可以修改。此外,您的函数返回指针的副本,因此无论如何都没关系。
它不会打开修改
_px
的大门,而是打开 _px
所指向的内容。由您决定是否允许这样做。
例如,
iterator::operator->
将返回非常量指针,const_iterator::operator->
将返回常量指针。两种方法本身都可以是 const。
是的,对于你的情况可以。但是,通常建议不要这样做,因为它允许更改常量对象:
void f(const A& a)
{
*(a.foo()) = 42; // damn!
}
是的,例如参见 std::streambuf 指针:
protected:
char* pbase() const;
char* pptr() const;
char* epptr() const;