#include #include class String { int numel; char *data; public: String():numel(0),data(NULL) { std::cout<<"defS\n"; } String(char const *init) { numel = strlen(init); data = new char[numel]; memcpy(data, init, numel); std::cout<<"cstrS\n"; } ~String() // szükséges, hogy ne legyen mem leak { delete[] data; std::cout<<"~S\n"; } String(String const &m) // Hármasszabály! { numel = m.numel; data = new char[numel]; memcpy(data, m.data, numel); std::cout<<"copyS\n"; } String& operator=(String const &rhs) // Hármasszabály! { if (this != &rhs) { delete[] data; numel = rhs.numel; data = new char[numel]; memcpy(data, rhs.data, numel); std::cout<<"Copy=S\n"; } return *this; } String operator+(const String &rhs)const { String e; e.numel=numel+rhs.numel; e.data=new char[e.numel]; memcpy(e.data, data, numel); memcpy(e.data+numel, rhs.data, rhs.numel); return e; } // -std=c++11 és --no-elide-constructors mellett fordítsuk, nézzük mi fut a két # között, amit a c=a+b művelet vált ki. // Utána vegyük ki kommentből az alábbiakat, és teszteljük újra. /* String(String &&m) // move ctor { numel = m.numel; data = m.data; m.data = NULL; std::cout<<"moveS\n"; } String& operator=(String &&rhs) // move op= { if (this != &rhs) { delete[] data; numel = rhs.numel; data = rhs.data; rhs.data=NULL; std::cout<<"Move=S\n"; } return *this; } */ void print(std::ostream& os=std::cout) { for(auto i=data;i!=data+numel; ++i) os<<*i; } }; int main() { String a("hello "),b("world!\n"),c; std::cout<<"#\n"; c=a+b; std::cout<<"#\n"; c.print(); }