const成员函数可以返回一个非const指针指向数据成员吗?

时间:2012-01-09 13:05:53

标签: c++ const

代码优先:

class A
{
    public:
        ...
        int *foo() const
        {
            return _px;
        }
    private:
        int *_px;
}

成员函数foo返回一个指向private成员_px的非const指针,我认为这会指向修改成员_px的大门,对吗? / p>

fooconst会员功能吗?我应该在返回类型前添加const吗?

更新

const-member-function应该保证的是,它不能改变任何数据成员,对吗?

在我的情况下,函数foo无法打开修改class A数据成员_px的大门,而是修改_px指向的内容的大门,所以我的问题是,这是否违反了const函数应该保证的内容?

5 个答案:

答案 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;

http://en.cppreference.com/w/cpp/io/basic_streambuf/pptr