【问题标题】:what is the best and how declare const in function of c++什么是最好的以及如何在 c++ 的函数中声明 const
【发布时间】:2013-08-23 15:17:01
【问题描述】:

我有这些代码

#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 const *_ex; 是一个仅指向 Ex const 的指针。为什么上面的一切正常?

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

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

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

【问题讨论】:

  • 你的问题不是很清楚
  • 好的。我更新了我的最后一个问题

标签: c++ function constants declare raw-pointer


【解决方案1】:
  1. 指向const 的指针(或引用)不必指向const 对象。它只是意味着它不能用于修改它指向的对象;因此它可以安全地指向const 或非const 对象。

  2. 是的。具体来说,就是不能使用作为函数参数传递的引用来修改对象。

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

【讨论】:

  • @quano1:抱歉,我现在不知道第三个问题在问什么。
  • 对不起,我的英语很急 :D 我修好了,希望你能理解
【解决方案2】:

首先,你实际上是对的,写void setEx(Ex const &amp;ex) 表示在setEx 内部,参数&amp;ex 是cv-qualified。

这并不意味着所指向的(或在您的案例中引用的)一定是调用代码中已经 const 的东西。

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

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

  • 如果不应修改数据:Ex const * ex; 将强制执行。
  • 如果不应修改指针:Ex * const ex; 将强制执行。
  • 如果指针和数据都必须保持不变:Ex const * const ex; 可以。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多