![](/img/trans.png)
[英]Should I declare a method const, when underlying OpenGL state is modified
[英]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.