Metoda ktora w nazwie ma referencje

0

2 pytania w komentarzu POMOCY!

 
#include <iostream>
using namespace std;

class punkt
{
	float _x, _y, _z; // Nie wiem dlaczego "_x" tak sa zapisywane punkty ? w celu odroznienia ? na takiej samej podstawie jak sie przyjmuje zeby pisac klase z duzej litery a nie z malej zeby szybciej sie odroznilo obiekt klasy od zmiennej ?
	
public:
	punkt()
	{
		_x=_y=_z=0;
	}
	
	punkt(float a, float b, float c)
	{
		_x=a; 
		_y=b; 
		_z=c;
	}
	// Nie rozumiem tych funkcji jedynie wiem ze za ich pomoca jestem w stanie zmienic atrybuty prywatne klasy punt . Jesli ktos moglby mi rozpisac o co w tym chodzi bylbym bardzo wdzieczny!
	float & x(){ return _x; }  
        const float & x() const { return _x; }
	float & y(){ return _y; }
	const float & y() const { return _y; }
	float & z(){ return _z; }
	const float & z() const { return _z;}
};
int main()
{
	punkt p1, p2(1,2,3);
	const punkt p3(1.1,2.2,3.3);
	cout << p3.x() << "\t" << p3.y() << "\t" << p3.z() << endl;
	p1.x()=1; p1.y()=10; p1.z()=100;
	cout << p1.x() << "\t" << p1.y() << "\t" << p1.z() << endl;
return 0;
}
6

Pytania zadaj w poście, a nie w kodzie.

  1. Bo ktoś sobie tak wymyślił. Jego konwencja. Ktoś inny może nazywać pola klasy x_, y_, z_.

  2. float& x() zwraca referencję do zmiennej, dzięki czemu mając tę referencję można zmienić wartość tej zmiennej. Nie wiem co tutaj można tłumaczyć, jeżeli wiesz czym jest referencja to zrozumiesz, a jak nie to żadne tłumaczenie nie pomoże.
    const float& x() const zwraca stałą referencję, czyli za pomocą tej referencji nie da się zmienić wartości tej zmiennej.
    Obie metody mają tę samą nazwę i to samo ciało, ale kompilator jest na tyle sprytny, że jak widzi

cout << p1.x()

czyli z tej metody jest pobierana wartość, to stosuje wersję const, a jak widzi

p1.x() = 1

czyli do wyniku tej metody jest przypisana wartość, to stosuje wersję pierwszą.

Ogólnie taki sposób zmiany pól w klasie jest błędogenny, lepsze są klasyczne get/set

0

Nie weim dlaczego ale ten zapis

 
 float& x(return _x);   myli mi sie z float x(return &_x);
i poki co tez nie spotkalem z takim zapisem zeby przypisac metodzie(funkcji) p1.()=10 jakas wartosc tylko zeby funkcja przyjela sobie jakis argument. Naprzklad  p1.(10); (przynajmniej w symfonii c++ nie natchnalem sie na to)

4

@balti
strasznie nieczytelnie piszesz posty
A co do Twoich pytan... Witaj w C++. Poczytaj sobie o referencjach i pocwicz.

Gdy zwracasz referencje to pracujesz na TYM SAMYM obiekcie/zmiennej. Gdy nie dasz przy zwracanym typie & to wtedy jest tworzona KOPIA (zobacz sobie adresy zmiennych gdzie sie znajduja)

2

Pisz w poście, nie kodzie.

balti napisał(a):

Nie weim dlaczego ale ten zapis

 float& x(return _x);

myli mi sie z float x(return &_x);


Bo nie znasz referencji. Poza tym druga wersja jest niepoprawna. Funkcja deklaruje, że zwraca `float`, natomiast `return &_x` zwraca **adres** zmiennej `_x`.


> i poki co tez nie spotkalem z takim zapisem zeby przypisac metodzie(funkcji) p1.()=10 jakas wartosc
Bo to nie jest popularny sposób i nie należy go używać póki nie będziesz wiedział co i jak.

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