我有一個程序和它的許多類有一些運營商和方法與const關鍵字一樣如下:常量和C++中沒有const方法?
operator const char*() const;
operator char*();
void Save(const char *name) const;
void Load(const char *name);
第一:這是什麼在方法聲明的結尾說const?是的就像是在開始時一樣?
第二:爲什麼會需要const()和const的const版本?
在此先感謝。
我有一個程序和它的許多類有一些運營商和方法與const關鍵字一樣如下:常量和C++中沒有const方法?
operator const char*() const;
operator char*();
void Save(const char *name) const;
void Load(const char *name);
第一:這是什麼在方法聲明的結尾說const?是的就像是在開始時一樣?
第二:爲什麼會需要const()和const的const版本?
在此先感謝。
'const'在最後告訴編譯器,這個方法不會改變任何成員變量 - 在const實例上調用這個方法是安全的。所以,可以在一個const實例上調用Save,因爲它不會更改該實例。另一方面,加載會改變實例,所以不能在常量實例上使用。
operator()的const版本傳回一個const指針,保證返回的緩衝區不會改變。推測這是一個指向類的實例變量的指針。對於非常量實例,另一個operator()返回一個非const指針。它必須是一個指向某些內存的指針,即使寫入,也不會改變實例的內容。
此外,有時候查找'可變'關鍵字。理解這將有助於你理解常量正確性的這種想法。
成員函數的常量。這意味着函數不能(*)修改任何成員變量。這就像在這個函數調用中爲所有成員變量放置一個const。這是您班級客戶的一個很好的保證,也可能有助於編譯器優化。
(*) - 另請參閱關鍵字mutable。
第一:在方法聲明結束時它是什麼意思,是否像在開始時一樣?
編號A const
最後意味着該方法可能會被聲明爲const
的對象調用。 A開頭的const
表示返回值爲const
。
第二:爲什麼會是operator()所需的const版本和非const版本?
非常量版本返回一個不是const的char*
。通過修改這個char*
,你實際上可以修改對象(假設char*
是對象的成員)。
由於這是不允許的const
對象,對於const對象有operator()
的重載,因此返回const char*
,因此無法通過它修改該對象。
將const
放在方法聲明的末尾是說明對象本身或this
是const
而不是返回類型。
由於複雜的原因,C++允許在const
上重載方法。沒有足夠的空間在這裏詳細介紹。但這裏有一些短的。
const
類型調用方法時,方法的行爲會有所不同。最直接的例子是當你想從const
方法返回一個const
值,並從普通方法返回一個非常量值。this
是否const
顯着地改變了內部方法的綁定。它基本上會成爲兩個不同的方法體。因此將其分解成2種不同的方法是有意義的。const在開始處適用於返回值。最後的Const適用於方法本身。當你將方法聲明爲「const」時,你說你不打算修改方法中類的任何成員變量。編譯器甚至會做一些基本的檢查,以確保該方法不會修改成員變量。返回值中的const阻止調用者修改返回的值。當您返回指向由類管理的數據的指針或引用時,這會很有用。這通常是爲了避免返回複雜的數據副本,而這些數據在運行時可能很昂貴。
你有兩個不同的運算符的原因是,「const」版本返回一個const指針,指向類內部的可能數據。如果類的實例是const,那麼你希望返回的數據也應該是const。 「非常量」版本只是提供了一種方法,當調用者擁有該類的非常量實例時,該方法將返回可修改的返回值。
除了其他答案之外,還有一個注意事項:在您的示例中沒有operator()
。
operator const char*() const;
operator char*();
是轉換運算符,它意味着類的對象可以被隱式轉換爲C語言風格的字符串,如
void f(const MyClass& x, MyClass& y) {
const char* x_str = x;
char* y_str = y;
}
的聲明和operator()
使用,這意味着可以使用一個對象類類型有點像函數的,看起來像:
class MyClass {
public:
const char* operator() (int x, int y) const;
// ...
};
void g(const MyClass& obj) {
const char* result = obj(3, 4);
}
如果你正在尋找基於C一個很好的資源++(包括使用提示正確)嘗試「有效的C++」。
有關這方面的一個有用的網站:JRiddel.org
在C++中,當你通過把它與要斷言「這個方法不會改變對象的任何非mutable
實例變量的方法簽名後聲明的方法const
它正在被召喚。「
返回值之前的const
(例如const:operator const char*..."
)聲明它只返回指向const char*
的變量指針。 (您不能更改char*
的內容,但可以重新分配指針。)如果你寫了「const char* const ...
」,它將是一個常量字符的常量指針。 (const
在星號之後)。
的多個版本是有用的,因此編譯器可以明白這一點:
const char* my_const_var = <object_name>();
char* my_var = <object_name>();
克里斯
你應該是指「HIGH·INTEGRITY C++編碼規範手冊」爲了解時,建議它使用const修飾符用於類成員:
高完整性CPP規則3.1.8:聲明'const'任何不修改對象的外部可見狀態的類成員函數。 (QACPP 4211,4214)
說明理由:雖然語言強制逐位正確性,但const正確性應該被認爲是邏輯的,而不是按位。如果客戶端無法確定該對象是否因調用該函數而發生更改,則應將該成員函數聲明爲const。 'mutable'關鍵字可以用來聲明可以在const函數中修改的成員數據,只有在成員數據不影響對象的外部可見狀態的情況下才可以使用。
class C
{
public:
const C& foo() { return * this; } // should be declared const
const int& getData() { return m_i; } // should be declared const
int bar() const { return m_mi; } // ok to declare const
private:
int m_i;
mutable int m_mi;
};
參考有效C++項目21;工業強度C++ 7.13;
好的,我把我的回答拿回來,你的情況更加清晰。 – 2010-10-15 15:30:23