2010-06-03 101 views
1

我所經歷的:常見問題::(23.1除了打印C++ FAQs about inheritance,決定執行它(只是爲了學習吧)const正確性

#include "Shape.h" 

void Shape::print() const 
{ 
    float a = this->area(); // area() is pure virtual 
    ... 
} 

現在,一切都在項目描述(當然,幾乎)工程)是const的,所以只要你取出const,它就不能訪問「this」指針。 現在,C++常見問題已經有一段時間了,通常都很不錯。這是一個錯誤嗎? 他們有錯字還是我錯了?如果我錯了,我想知道如何在const函數中訪問「this」指針。

+0

出於好奇,你使用的編譯器是什麼? – 2010-06-03 16:12:59

+1

鑑於我之間的選擇可能沒有正確理解,或者是一個近乎20歲的經常被引用的參考文獻,在一個微不足道的案例中有錯誤或錯字,我傾向於懷疑我可能錯過了一些東西。 – JohnMcG 2010-06-03 17:45:33

+1

順便說一句,節省一些打字時間,避免'this->'。在C++中不需要它。 *也許是來自Java的遺留特質?* – 2010-06-03 18:53:38

回答

18

問題是area()函數不是const。如果該函數是const,那麼這將編譯好。由於你在const函數內部,這個指針是const的,所以你只能在它上面調用const函數。

8

爲什麼不能訪問this?關鍵是,只有const成員和方法可以使用。因此,如果Shape::area()宣佈爲const,則沒有問題。此外,您還可以自由讀取數據成員的值,而不是爲他們分配:

class Shape 
{ 
    int i; 
    void print() const; 
    virtual float area() const = 0; 
    virtual void modify() = 0; 
}; 

void Shape::print() const 
{ 
    float a = this->area(); // call to const member - fine 
    int j = this->i;  // reading const member - fine 

    this->modify();   // call to non const member - error 
    this->i++;    // assigning to member - error 
} 
+0

你說得對。輸入問題後,我確實得到了答案,但會接受答案,並讓其他人學習。 – ra170 2010-06-03 16:17:05

1

如果print被定義爲const,那麼它可以使用this訪問const成員,但不能訪問非const成員:所以它can invoke this->area() if-and-only - 如果area方法被聲明爲const(即如果area方法承諾,如果它被調用,那麼它不會改變它的Shape實例)。

0

您當然可以訪問this指針,但是在const函數中,它將成爲指向const對象的指針。請記住,this指針不是一個真正的指針實例,因此它可以在程序中的不同位置更改它的類型。

1

默認情況下,將所有函數聲明爲const也是一個好習慣,並且只有在實際需要修改對象時纔會這樣做。這也有助於發現某種功能修改某些不適用的錯誤。