|
こんばんは。たかさんのコードに手を入れてみました。
operator=(const char*)を定義してないですがデフォルトコンストラクタが
変換コンストラクタをかねているので動作には問題ありません。(メッセージでわかる)
もちろんよけいなコンストラクタ、デストラクタの呼び出しをさけるために
operator=(const char*)を多重定義した方がいいとおもいます。
#include <iostream>
#include <cstring>
class Class {
char* buf;
public:
//default constructor
//conversion constructor const char* => Class
Class(const char* str = NULL) {
std::cout << "デフォルトコンストラクタが呼ばれました。" << std::endl;
if (str == NULL) {
buf = new char[1];
*buf = '\0';
return;
}
buf = new char[std::strlen(str) + 1];
std::strcpy(buf, str);
}
//copy constructor
Class(const Class& c) {
std::cout << "コピーコンストラクタが呼ばれました。" << std::endl;
buf = new char[std::strlen(c.buf) + 1];
std::strcpy(buf, c.buf);
}
//destructor
~Class() {
std::cout << "デストラクタが呼ばれました。" << std::endl;
delete[] buf;
}
Class& operator=(const Class& x) {
//自身への代入のチェック
if (&x == this)
return *this;
delete[] buf;
buf = new char[std::strlen(x.buf) + 1];
std::strcpy(buf, x.buf);
return *this;
}
friend std::ostream& operator<<(std::ostream& os, Class& cl) {
os << cl.buf;
return os;
}
};
int main()
{
Class cl("test");
Class kurasu(cl);
Class klass;
kurasu = "hoge"; //変換コンストラクタ
klass = cl;
std::cout << cl << std::endl;
std::cout << kurasu << std::endl;
std::cout << klass << std::endl;
return 0;
}
|