我是否应该使用const如果传递的对象现在不会被修改,但可以在以后修改

时间:2012-12-02 05:03:17

标签: c++

我正在编写一个游戏,其中每个数据对象都由ControlView显示。当ControlView设置为显示数据对象时,它不应更改它。我想使用const来强制执行此约定。但是,为了响应用户之后与ControlView的交互,可以修改数据。因此需要存储非const指针。我想知道这是否被接受并正确使用const_cast?。下面的骨架代码

class Data
{
  int m_int;
  public:
    void add(int i)  { m_int += i ; };
 };

class ControlView
{
 Data* m_data;
 public:
 void set_data(const Data* d)  //this call should not change d 
        { 
            m_data=const_cast<Data*>(d); //cast needed to compile
        }; 

        void manipulate_data(int x)
        { 
            m_data->add(x);
        }
};

3 个答案:

答案 0 :(得分:2)

如果您想修改对象,请不要将其设为const。修改const对象,例如通过const_cast,是未定义的行为。

所以不要将const用于m_data,但是您可以在代码中使用其他几个const

  • 您可以使用const保护函数参数。这通常不是很有意义,因为您通常不关心指针,而是它指向的对象。但它可以帮助您避免在代码中意外重新记录d等错误:
void set_data(Data * const d); // const pointer to (non-const) Data
// this means the function can not change d (the pointer), but it can
// change the object that d points to.
  • 您可以制作非修改函数const。这声明该函数不会以任何方式更改对象(除非有mutable个成员)。如果您尝试修改此类函数中的任何成员,编译器将会出错。这些函数也是您可以在const对象上调用的唯一函数。
Data * get_data() const; // this function doesn't change anything

请注意,如果您有mutable个成员,则可以从const函数更改,但这不应该被滥用。这适用于内部事物,如互斥或缓存。

另请注意,引用始终为const - 无法将它们重新分配以指向另一个对象。它们引用的对象可以是const或非const。

最后提示:从右到左阅读声明:

Data       *       d;   // pointer to Data (both can be changed)
Data       * const d;   // const pointer to Data (data can be changed)
Data const *       d;   // pointer to const Data (pointer can be changed)
Data const * const d;   // const pointer to const Data (neither can be changed)

Data         &       d;   // reference to non-const Data
//Data       & const d;   // invalid - all references are const
Data const   &       d;   // reference to const Data
//Data const & const d;   // invalid - all references are const

答案 1 :(得分:2)

在这种情况下,不,请勿使用const。如果你这样做,你就让任何人传递一个const作为参数,之后最终可能会遇到未定义的行为:

 const Data d;
 ControlView c;
 c.setData(&d);    //legal, because setData takes a const as parameter
 c.manipulateData(0);  //undefined behavior, modifying an originally const object

答案 2 :(得分:0)

您需要了解const data *d的含义。这意味着可以更改指针d,但指针d指向Data类型为const的对象,即不可变。

你应该拥有的是

void set_data(Data * const d)  //this call should not change d 
{ 
    m_data=d;
};

代码Data * const d表示方法不能改变指针d,但d指向可以改变的对象。

我的理念是,当你使用演员阵容时,你可能会做错事。尽量避免它们。