0

我有这些代码

#include <iostream>
using namespace std;
class Ex;
class Exx;

class Ex {
public:
    int _val;
    int const *_p_val;
    void setPtrVal(int * const &val) {
        _p_val=val;
    }
};

class Exx {
public:
    Ex const *_ex;
    void setEx(Ex const &ex)
    {
        _ex=&ex;
    }
};

int main()
{
    Ex x;
    int i=10;
    x.setPtrVal(&i);
    Exx xx;
    xx.setEx(x);
    int y=20;
    cout<<*(xx._ex->_p_val)<<endl;
    x.setPtrVal(&y);
    cout<<*(xx._ex->_p_val)<<endl;
    cout<<*x._p_val<<endl;
    return 0;
}

1:可以看到,Ex x不是Ex class的 const 。和Ex 常量 *_ex; 是仅指向Ex const的指针。为什么上面的一切都好?

2:void setEx(Ex const &ex)中的 const只是意味着你不能在函数体中修改 ex 吗?

3:如果我想要上面的原型(假设出于安全原因),如何修复成员指针变量的setter函数?

好的。如果 Ex 常量 *_ex; 成为 Ex *_ex; 所以,在 setter 函数中,我想要一个原型不修改参数对象,就像上面一样。功能体如何变成?

4

2 回答 2

0
  1. 指向的指针(或引用)const不必指向const对象。它只是意味着它不能用于修改它指向的对象;因此它可以安全地指向一个const或非const对象。

  2. 是的。具体来说,这意味着作为函数参数传递的引用不能用于修改对象。

  3. const如果您不需要使用它进行修改,最好包含它。这将防止意外修改,并允许您指向const对象。

于 2013-08-23T15:26:29.643 回答
0

首先,您实际上是对的,写作void setEx(Ex const &ex)意味着 inside setEx,参数&ex是 cv 限定的。

这并不意味着所指向的(或在您的情况下引用的)必然是调用代码中已经 const 的东西。

然后,什么是最好的,这取决于你真正想要什么。如果你Ex const* ex;为你的成员写,这意味着一旦通过你的对象初始化设置,对象本身(通过它的成员函数)就不能修改指向的数据。它仍然可以为指针分配一个新值(使其指向其他地方),但这意味着它不能修改所指向的内容。

最后,它归结为你想要什么。

  • 如果不应该修改数据:Ex const * ex;将强制执行。
  • 如果指针不应该被修改:Ex * const ex;将强制执行。
  • 如果指针和数据都必须保持不变:Ex const * const ex;就可以了。
于 2013-08-23T15:27:54.697 回答