2013-12-15 90 views
1

在下面的代碼中,爲什麼函數SymmetricAxis可以在p3中更改x和y? 我認爲const函數將不允許改變成員的值。但它確實如此,所以我很困惑。 此外,如果我將p3更改爲const CPoint p3,編譯器不允許我這樣做。但是,如果p3不是const,程序可以更改p3中的成員。類中的const函數可以改變成員值嗎?

#include<iostream> 
#include<math.h> 
using namespace std; 

class CPoint 
{ 
private: 
    double x; 
    double y; 
public: 
    CPoint(double xx = 0, double yy = 0) : x(xx), y(yy) {}; 
    double Distance(CPoint p) const; 
    double Distance0() const;   
    CPoint SymmetricAxis(char style) const; 
    void input(); 
    void output(); 
}; 
void CPoint::input(){ 
    cout << "Please enter point location: x y" << endl; 
    cin >> x >> y; 
} 
void CPoint::output(){ 
    cout << "X of point is: " << x << endl << "Y of point is: " << y << endl; 
} 
CPoint CPoint::SymmetricAxis(char style) const{ 
    CPoint p1; 
    switch (style){ 
     case 'x': 
      p1.y = -y; 
      break; 
     case 'y': 
      p1.x = -x; 
     case '0': 
      p1.x = -x; 
      p1.y = -y; 
      break; 
    } 
    return p1; 
} 
int main(){ 
    CPoint p1, p2(1, 10), p3(1,10); 
    p1.input(); 
    p1.output(); 
    p3 = p1.SymmetricAxis('0'); 
    p3.output(); 
    return 0; 
} 

回答

2

SymmetricAxis變化p3值。 SymmetricAxis僅返回一個新的CPoint作爲未命名的臨時值。 (該臨時值由SymmetricAxis正文中的局部變量p1初始化。)

複製賦值運算符將此臨時值複製到p3的值上。

SymmetricAxis上的const限定符僅表示呼叫p1.SymmetricAxis('0')不會更改p1。它沒有說明你將該呼叫的結果分配給了什麼。

(實現/優化注:編譯器被允許優化掉這些副本中的一種或多種,​​但const在這方面的意思假定這些副本發生)

1

你變化的變量上函數內部的局部變量,而不是任何成員變量。例如,如果您編寫了this->y = 0,則會出現編譯錯誤。 const限定符只承諾不會更改*this

爲了澄清,*thisp1(你調用的函數。)你創建一個局部變量也稱爲p1你被允許修改(因爲它是不一樣的this)。 p3根本不起作用。

相關問題