2010-10-15 108 views
5

我有一個程序和它的許多類有一些運營商和方法與const關鍵字一樣如下:常量和C++中沒有const方法?

operator const char*() const; 
operator char*(); 
void Save(const char *name) const; 
void Load(const char *name); 

第一:這是什麼在方法聲明的結尾說const?是的就像是在開始時一樣?

第二:爲什麼會需要const()和const的const版本?

在此先感謝。

回答

2

'const'在最後告訴編譯器,這個方法不會改變任何成員變量 - 在const實例上調用這個方法是安全的。所以,可以在一個const實例上調用Save,因爲它不會更改該實例。另一方面,加載會改變實例,所以不能在常量實例上使用。

operator()的const版本傳回一個const指針,保證返回的緩衝區不會改變。推測這是一個指向類的實例變量的指針。對於非常量實例,另一個operator()返回一個非const指針。它必須是一個指向某些內存的指針,即使寫入,也不會改變實例的內容。

此外,有時候查找'可變'關鍵字。理解這將有助於你理解常量正確性的這種想法。

2

成員函數的常量。這意味着函數不能(*)修改任何成員變量。這就像在這個函數調用中爲所有成員變量放置一個const。這是您班級客戶的一個很好的保證,也可能有助於編譯器優化。

(*) - 另請參閱關鍵字mutable。

8

第一:在方法聲明結束時它是什麼意思,是否像在開始時一樣?

編號A const最後意味着該方法可能會被聲明爲const的對象調用。 A開頭的const表示返回值爲const

第二:爲什麼會是operator()所需的const版本和非const版本?

非常量版本返回一個不是const的char*。通過修改這個char*,你實際上可以修改對象(假設char*是對象的成員)。

由於這是不允許的const對象,對於const對象有operator()的重載,因此返回const char*,因此無法通過它修改該對象。

+1

好的,我把我的回答拿回來,你的情況更加清晰。 – 2010-10-15 15:30:23

1

const放在方法聲明的末尾是說明對象本身或thisconst而不是返回類型。

由於複雜的原因,C++允許在const上重載方法。沒有足夠的空間在這裏詳細介紹。但這裏有一些短的。

  • 非常值得注意的是,當從const類型調用方法時,方法的行爲會有所不同。最直接的例子是當你想從const方法返回一個const值,並從普通方法返回一個非常量值。
  • this是否const顯着地改變了內部方法的綁定。它基本上會成爲兩個不同的方法體。因此將其分解成2種不同的方法是有意義的。
0
  1. const在開始處適用於返回值。最後的Const適用於方法本身。當你將方法聲明爲「const」時,你說你不打算修改方法中類的任何成員變量。編譯器甚至會做一些基本的檢查,以確保該方法不會修改成員變量。返回值中的const阻止調用者修改返回的值。當您返回指向由類管理的數據的指針或引用時,這會很有用。這通常是爲了避免返回複雜的數據副本,而這些數據在運行時可能很昂貴。

  2. 你有兩個不同的運算符的原因是,「const」版本返回一個const指針,指向類內部的可能數據。如果類的實例是const,那麼你希望返回的數據也應該是const。 「非常量」版本只是提供了一種方法,當調用者擁有該類的非常量實例時,該方法將返回可修改的返回值。

1

除了其他答案之外,還有一個注意事項:在您的示例中沒有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); 
} 
1

如果你正在尋找基於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>(); 

克里斯

1

你應該是指「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;