Dlaczego metoda stała obiektu modyfikuje pola tego obiektu ?

0

Czy mógłby mi ktoś wytłumaczyć, dlaczego metoda stała przesun1 obiektu Punkt o nazwie p2 dokonuje modyfikacji pól tego obiektu skoro zdefiniowałem i zdeklarowałem ją jako stałą, a z tego co wyczytałem w książce, to nie może ona modyfikować pól tego obiektu, a modyfikuje ( p2.przesun1(p2); ) !

#include <iostream>

class Punkt{
	private:
		double x, y;
	public:
		Punkt(double x, double y){
			this->x = x;
			this->y = y;
		}	
		
		void przesun1(Punkt& p) const;
		void przesun2(Punkt& p);
		void przesun3(Punkt p);
		
		double getX(){return x;}
		double getY(){return y;}
};

void przesun1(Punkt& p) const{
	p.x += x;
	p.y += y;
}

void Punkt::przesun2(Punkt& p) {
	p.x += x;
	p.y += y;
}

void Punkt::przesun3(Punkt p) {
	p.x += x;
	p.y += y;
}

main(void) {
	//const Punkt p1(1,1);
	Punkt p2(2,2);
	
	std::cout<<p2.getX()<<' '<<p2.getY()<<std::endl;
	
	p2.przesun1(p2); // według mnie kompilator powinien zgłosić jakiś błąd
	
	std::cout<<p2.getX()<<' '<<p2.getY()<<std::endl;
}
3

Przecież ona bierze ekstra parametr i jego modyfikuje.

Const w "void przesun1(Punkt& p) const;" dotyczy thisa, a do niego się w ogóle nie dobierasz.

0

To jeśli zrobiłbym coś takiego to wtedy metoda nie może modyfikować pola obiektu:


void Punkt::przesun1(Punkt& p) const{
{
	this->x = p.x; // to jest niedozwolne gdy const
	this->y = p.y;

}
 
2
void przesun1(Punkt& p) const

można modyfikować p, nie można modyfikować *this

void przesun1(const Punkt& p)

nie można modyfikować p, można modyfikować *this

void przesun1(const Punkt& p) const

nie można modyfikować ani p ani *this

0

I jeszcze jedna ciekawsotka,

jeśli napiszesz

mutable int x, y;

wtedy metoda constowa będzie mogła modyfikować this->x i this->y :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1