#include #include using std::ostream; class string { public: string() : buf( new char[1]) { std::cout << "default" << std::endl; buf[0] = '\0'; } string(const char* s) : buf(new char[strlen(s)+1]) { std::cout << "convert" << std::endl; strcpy(buf, s); } string(const string& s) : buf(new char[s.size()+1]) { std::cout << "copy" << std::endl; strcpy(buf, s.buf); } ~string() { std::cout << "destruct: " << buf << std::endl; delete [] buf; } int size() const { return strlen(buf); } const char* getBuf() const { return buf; } void setBuf(const char* b); const string& operator=(const string& rhs); private: char *buf; }; ostream& operator<<(ostream &lhs, const string &s) { return lhs << s.getBuf(); } const string& string::operator=(const string& rhs) { std::cout << "assign" << std::endl; } void string::setBuf(const char* b) { } class Test { public: Test() : x("cat") { } //Test() { x = "cat"; } private: string x; }; void f(const string & s) {} int main() { Test test; }