在下面的代码中,为什么函数SymmetricAxis可以在p3中更改x和y? 我认为const函数不允许更改成员的值。但确实如此,所以我很困惑。 此外,如果我将p3更改为const CPoint p3,编译器不允许我这样做。但是如果p3不是const,程序可以改变p3中的成员。
#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;
}
答案 0 :(得分:2)
SymmetricAxis
不更改p3
的值。 SymmetricAxis
仅返回一个新的CPoint
作为未命名的临时值。 (该临时值由p1
正文中的局部变量SymmetricAxis
初始化。)
复制赋值运算符将此临时值复制到p3的值上。
const
上的SymmetricAxis
限定词仅表示调用p1.SymmetricAxis('0')
不会更改p1
。它没有说明你将该调用的结果分配给。
(实现/优化注释:允许编译器优化掉这些副本中的一个或多个,但在此上下文中const
的含义假定这些副本发生。)
答案 1 :(得分:1)
您正在更改函数内部的变量,而不是任何成员变量。例如,如果您编写this->y = 0
,则会出现编译错误。 const
限定符仅承诺不会更改*this
。
为了澄清,*this
指的是p1
(你称之为函数。)你创建了一个名为p1
的局部变量,你可以修改它(因为它不是相同的this
)。 p3
根本没有发挥作用。