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