繁体   English   中英

类中的const函数可以改变成员值吗?

[英]Const function in class can change the member value?

在下面的代码中,为什么函数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;
}

SymmetricAxis 改变的值p3 SymmetricAxis仅返回一个新的CPoint作为未命名的临时值。 (该临时值由SymmetricAxis主体中的局部变量p1初始化。)

复制赋值运算符将此临时值复制到p3的值上。

SymmetricAxis上的const限定符仅表示调用p1.SymmetricAxis('0')不会更改p1 它没有说明你将该调用的结果分配给了什么。

(实现/优化注释:允许编译器优化掉这些副本中的一个或多个,但在此上下文中const的含义假定这些副本发生。)

您正在更改函数内部的变量,而不是任何成员变量。 例如,如果您写this->y = 0 ,您将收到编译错误。 const限定符只承诺不改变*this

为了澄清, *this指的是p1 (你将函数称为on。)你创建了一个名为p1的局部变量,你可以修改它(因为它与this )。 p3根本没有发挥作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM