Hej, niby zwracanie obiektów/zmiennych przez wartość do podstawy-podstaw jednak kiedy w książce była mowa o zwracaniu przez wartość obiektu niemodyfikowalnego (const) to sprawa się nawet rozwinęła i zadałem sobie wiele pytań...
np. taki programik:
class Kl{
public:
int a;
int b;
Kl(int v){
a=v;
b=v*2;
}
};
int r1(){ //zwraca int
int i = 6;
return i;
}
Kl r2(){ //zwraca Kl
Kl k = 4;
return k;
}
int main(){
r1() = 3; //to powoduje błąd
r2() = 3; //jest ok
}
Dlaczego użycie po lewej stronie wyrażenia funkcji zwracającej int'a powoduje błąd a w przypadku zwracającej nasz obiekt już nie? ( wiem oczywiście że z obiektem też byś my nie mogli tak zrobić zwracając go z użyciem const ). Jednym słowem dlaczego r1() zwraca nam r-wartość a r2() już chyba l-wartość ?
Zaciekawiła mnie jeszcze kwestia konstruktora kopiującego, gdy mam takie coś:
class Kl{
Kl(const Kl& k){
*this = k;
}
public:
int a;
int b;
Kl(int v){
a=v;
b=v*2;
}
};
Przez to nie ma możliwości zwracania obiektu przez wartość bo nie ma publicznego konstruktora kopiującego, to rozumiem.
Zaciekawiło mnie jednak że w ogóle w ciele konstruktora możemy używać wskaźnika this ( na obiekt wywołujący ), skoro konstruktor dopiero tworzy ten obiekt, to formalnie tego obiektu jeszcze nie ma więc jak się możemy do niego odwoływać? No chyba że powstaje jeszcze przed wywołaniem takiego konstruktora, chyba na pewno bo teraz zanegowałem prawo działania jakiegokolwiek konstruktora ;).
I jeszcze jedno:
class Kl{
public:
int a;
int b;
Kl(const Kl& k){ //mój konstruktor kopiujący
std::cout<<"(Kl)\n";
*this = k;
}
Kl(int v){
std::cout<<"(int)\n";
a=v;
b=v*2;
}
Kl operator=(int v){
std::cout<<"(operator)\n";
a=v;
b=v*2;
}
};
Kl r2(){
Kl k = 4;
return k;
}
W funkcji r2() przy zwracaniu obiektu konstruktor kopiujący powinien mi dać o sobie znać, a nie mam żadnego takiego powiadomienia jak (Kl). Dlaczego? To tak jakby kompilator i tak użył teraz wbudowanego konstruktora kopiującego :/ Z drugiej strony jak go przeniosę do składowych prywatnych to jest błąd. O co tu chodzi?
Z góry dziękuje wam za pomoc i serdecznie pozdrawiam.