2010-04-22 44 views
3

我有一個Point2D類,如下所示:C++ const限定符

class Point2D{ 
     int x; 
     int y; 
    public: 
     Point2D(int inX, int inY){ 
      x = inX; 
      y = inY; 
     }; 

     int getX(){return x;}; 
     int getY(){return y;}; 
    }; 

現在我已經定義的類Line爲:

class Line { 
Point2D p1,p2; 
public: 
LineVector(const Point2D &p1,const Point2D &p2):p1(p1),p2(p2) { 
     int x1,y1,x2,y2; 
     x1=p1.getX();y1=p1.getY();x2=p2.getX();y2=p2.getY(); 
} 
}; 

現在,編譯器提供了錯誤的最後一行(其中getX()被稱爲):

error: passing const Point2D as this argument of int Point2D::getX() discards qualifiers

如果我刪除const ke在這兩個地方,然後編譯成功。

什麼是錯誤?是否因爲getX()等被內聯定義?有沒有什麼辦法可以糾正這種情況,讓他們保持聯機狀態?

+1

因爲'getX'和'getY'是非常量,所以假設它們可以對類進行修改。但是'p1'和'p2'是'const',這意味着它們不能被修改。 Ergo,你不能在它們上面調用'getX'或'getY'。使這些函數爲'const'來表示它們不會修改實例。 – GManNickG 2010-04-22 08:20:25

+0

所有的答案告訴我使用'int getX()const {...}'。我想知道哪個答案是正確的? – Jet 2015-09-04 13:34:58

回答

8

您還沒有將getX()getY()方法聲明爲const。在C++中,只能從const對象中調用const方法。所以你的功能簽名應該是int getX() const{..}。通過將它們定義爲const方法,您告訴編譯器您不會修改此方法內的任何成員變量。由於你的對象是一個const對象,所以它不應該被修改,因此你只能調用它的const方法。

+1

爲什麼我需要將它們聲明爲常量?請詳細說明。 – avd 2010-04-22 08:19:15

+0

如果你沒有編譯器假定getX()有副作用或者改變你的對象。 LineVector構造函數在const Point2D對象上調用getX(),並且不允許更改const對象/引用。你必須告訴編譯器可以調用getX() - 通過將該方法標記爲const。你只能在const對象上調用const方法。 – nos 2010-04-22 08:33:24

2

爲了保證參數的一致性,你只能在它們上調用const方法,否則編譯器不能確定這些方法不會改變這個值。聲明的getX和作爲的getY常量,像這樣:

int getX() const {return x;} 
    int getY() const {return y;} 

注意,右大括號後的分號是沒有必要的。

1

嘗試定義了getX功能

int getX() const {...} 
1

你必須聲明你getX()getY()功能爲const太:

int getX() const {return x;} 
int getY() const {return y;} 

const關鍵字告訴編譯器,該方法不會改變對象的狀態

2

這是因爲getX()等不是常量。你可以將它們定義是這樣的:

int getX() const {return x;}; 
    int getY() const {return y;}; 
    // ---------^^^^^ 

由於p1p2是常數引用,一個只能調用const的方法。但是在getX()中沒有const修飾符時,它們被假定修改爲this(即p1p2),這是不允許的。

1

如果他們不修改狀態,則聲明您的成員函數爲「const」。

class Point2D{ 
    int x; 
    int y; 
public: 
    Point2D(int inX, int inY){ 
     x = inX; 
     y = inY; 
    }; 

    int getX() const {return x;}; 
    int getY() const {return y;}; 
    //   ^^^^^ 
}; 

這是關於隱藏的this參數。 this將是const Point2D*Point2D*類型。如果你有一個const Point2D的引用,你不能調用非const成員函數,因爲沒有從const Point2D*Point2D*的隱式轉換。

相關問題