const 成员函数可以返回指向数据成员的非常量指针吗?

问题描述 投票:0回答:5

代码先行:

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 应该保证吗?

c++ constants const-correctness
5个回答
43
投票

const
成员函数只能返回
const
指针或对成员的引用。

但是,您的示例并没有返回指向成员的指针;而是返回了指向成员的指针。它返回一个恰好是指针的成员的副本。这在

const
成员函数中是允许的(即使指针碰巧指向另一个成员)。

这是不允许的(请注意,它现在返回一个引用):

int *& foo() const {return _px;}

但这会(返回

const
参考):

int * const & foo() const {return _px;}

5
投票
在 const 成员函数中,

int *_px
变为
int *const _px
,这意味着指针无法重新定位,但指向的数据仍然可以修改。此外,您的函数返回指针的副本,因此无论如何都没关系。


5
投票

它不会打开修改

_px
的大门,而是打开
_px
所指向的内容。由您决定是否允许这样做。

例如,

iterator::operator->
将返回非常量指针,
const_iterator::operator->
将返回常量指针。两种方法本身都可以是 const。


3
投票

是的,对于你的情况可以。但是,通常建议不要这样做,因为它允许更改常量对象:

void f(const A& a) 
{
  *(a.foo()) = 42; // damn!
}

0
投票

是的,例如参见 std::streambuf 指针:

protected:
   char* pbase() const;
   char* pptr() const;
   char* epptr() const;

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

© www.soinside.com 2019 - 2024. All rights reserved.