簡體   English   中英

我是否應該使用const如果傳遞的對象現在不會被修改,但可以在以后修改

[英]should I use const if passed object will not be modified now, but can be modified later

我正在編寫一個游戲,其中每個數據對象都由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);
        }
};

如果您想要修改對象,請不要將其設為const 修改const對象(例如通過const_cast )是未定義的行為。

因此,不要將const用於m_data ,但是您可以在代碼中使用其他幾個const

  • 您可以使用const保護函數參數。 這通常不是很有意義,因為您通常不關心指針,而是它指向的對象。 但它可以幫助你避免像意外repointing錯誤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對象上調用的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

在這種情況下,不,不要使用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

您需要了解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指向可以改變的對象。

我的理念是,當你使用演員陣容時,你可能會做錯事。 盡量避免它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM