Nie mogę jednak zrozumieć o co chodzi w const BigInt&
To po prostu optymalizacja.
Mając funkcję:
void Funkcja( BigInt value )
{
value.number = 100; // zmiana wartości
}
za każdym razem kiedy wywołasz funkcję to musi zostać skopiowany cały obiekt ( a to przy złożoności klasy może spowodować problem z wydajnością )
int main()
{
BigInt someValue;
Funkcja( someValue ); // kopiuje obiekt - obiekt someValue pozostaje bez zmian po wywołaniu funkcji
Funkcja( someValue ); // kopiuje obiekt - obiekt someValue pozostaje bez zmian po wywołaniu funkcji
// itd..
}
Żeby tego uniknąć, musisz przekazać obiekt przez referencję (w funkcji będziesz ciągle operował na jednym obiekcie). Do tego służy operator &
:
void Funkcja( BigInt &value )
{
value.number = 100; // zmiana wartości
}
int main()
{
BigInt someValue;
Funkcja( someValue ); // nie kopiuje obiektu, zamiast tego przekazywany jest do funkcji adres obiektu (referencja) - someValue zostanie zmieniony
Funkcja( someValue ); // nie kopiuje obiektu, zamiast tego przekazywany jest do funkcji adres obiektu (referencja) - someValue zostanie zmieniony
// itd..
}
Natomiast powstaje pewien problem: wołając funkcję nie wiesz czy obiekt którym dysponujesz nie zostanie zmieniony przez funkcję. Żeby to uniemożliwić robisz referencję do obiektu, którego nie można zmienić - czyli const &
.
void Funkcja( const BigInt &value )
{
// value.number = 100; - ta linijka już się nie skompiluje, bo obiektu nie można zmienić.
}
int main()
{
BigInt someValue;
Funkcja( someValue ); // nie kopiuje obiektu, zamiast tego przekazywany jest do funkcji adres obiektu (referencja) - someValue nie może zostać zmieniony
Funkcja( someValue ); // nie kopiuje obiektu, zamiast tego przekazywany jest do funkcji adres obiektu (referencja) - someValue nie może zostać zmieniony
// itd..
}
Taki const &
jest jeszcze wymagany, kiedy chcesz przekazać obiekt tymczasowy do funkcji:
Na przykład:
int main()
{
Funkcja( BigInt() ); // BigInt() tworzy domyślnie skonstruowany obiekt tymczasowy o typie BigInt.
}
To się może przydać kiedy chcesz zrobić na przykład tak:
class BigInt
{
public:
BigInt() : number( 0 )
{
}
BigInt( int a ) : number( a )
{
}
BigInt operator+( const BigInt &obj )
{
BigInt wynik;
wynik.number = number + obj.number;
return wynik;
}
private:
int number;
};
int main()
{
BigInt x( 5 );
BigInt y = x + BigInt( 10 );
}
Jeszcze tak uściślając:
Nie można przekazać obiektu tymczasowego do zwykłej referencji (nie-const). Można przekazać przez wartość (bez &
) - jeśli oczywiście jest konstruktor kopiujący. Albo można też przekazać przez &&
(tzw Rvalue reference). Jeśli będziesz się uczył C++ jeszcze przez jakieś 5 lat to może do tego kiedyś dojdziesz.
&
- Lvalue reference
&&
- Rvalue reference
https://en.cppreference.com/w/cpp/language/reference