Witam, mam taki o to przykładowy kod:
#include <iostream>
#include <string>
using namespace std;
class Example6 {
string* ptr;
public:
// wskaŸnik na string jest inicjowany adresem obiektu typu string(pustego
Example6(const string& str): ptr(new string(str)) {cout << "wywolano zwykly konstruktor" << endl;}
// wskaznik jest inicjowany obiektem typu string o zawartosci znakow przeslanych w parametrze str
Example6 (const Example6& x) : ptr(new string(x.content())) {cout << "wywolano konstruktor kopiujacy"<<endl;}
Example6& operator= (const Example6& x){
delete ptr;
ptr = new string (x.content());
return *this;
}
// bedzie dzialac tak samo jak powyzsze rozwiazanie
// roznica jest taka, ze tutaj nie kasujemy starego obiektu, tylko kopiujemy zawartosc zawartosci wskaznika
/*Example5& operator= (const Example5& x){
//
*ptr = x.content();
return *this;
}*/
// moving constructor
Example6(Example6&& x) : ptr(x.ptr){
*ptr = "... jasiu";
x.ptr = nullptr;
}
// operator przypisania
Example6& operator= (Example6&& x){
// operator przenoszenia
cout <<"wywolano operator przenoszenia"<<endl;
delete ptr;
ptr = x.ptr;
// czyszczenie tego co jest pod x, tymczasowym obiektem
x.ptr = nullptr;
return *this;
}
~Example6 () {delete ptr; cout <<"wywolano destruktor"<<endl;}
// konstruktor kopiujacy, ktory zwraca wartosc a nie wskaznik
const string& content() const {return *ptr;}
void set_string(string str){ *ptr = str;}
Example6 operator+(const Example6& rhs){
return Example6(content() + rhs.content());
}
};
int main(){
Example6 foo("ss");
Example6 bar = Example6("abc");
cout << bar.content() << endl;
// foo = foo + bar;
// cout << "foo's content: " << foo.content() << '\n';
return 0;
}
W momencie kodu:
Example6 bar = Example6("abc");
powinien zostać użyty konstruktor przenoszenia(ang. move-constructor). Nie wiem jednak dlaczego uruchamiany jest zwykły konstruktor.
Może mi ktoś wyjaśnić dlaczego tak się dzieję? Używam standardu c++11.