私は、教育目的と必要性のために、独自の C++ String クラスを作成しようとしています。
まず、私は演算子についてあまり知らないので、演算子を学びたいと思っています。クラスの作成を開始しましたが、実行するとプログラムがブロックされますが、クラッシュはしません。
さらに読む前に、次のコードを見てください。
class CString
{
private:
char* cstr;
public:
CString();
CString(char* str);
CString(CString& str);
~CString();
operator char*();
operator const char*();
CString operator+(const CString& q)const;
CString operator=(const CString& q);
};
まず第一に、私はすべてが正しいと宣言したかどうか確信が持てません。私はそれについてググってみましたが、オーバーロードに関するすべてのチュートリアルは、非常に単純ですが、それぞれがいつどのように呼び出されるかを説明していない基本的なアイデアを説明しています。たとえば、my = 演算子では、プログラムは CString(CString& str); を呼び出します。しかし、私には理由がわかりません。
以下の cpp ファイルも添付しました。
CString::CString()
{
cstr=0;
}
CString::CString(char *str)
{
cstr=new char[strlen(str)];
strcpy(cstr,str);
}
CString::CString(CString& q)
{
if(this==&q)
return;
cstr = new char[strlen(q.cstr)+1];
strcpy(cstr,q.cstr);
}
CString::~CString()
{
if(cstr)
delete[] cstr;
}
CString::operator char*()
{
return cstr;
}
CString::operator const char* ()
{
return cstr;
}
CString CString::operator +(const CString &q) const
{
CString s;
s.cstr = new char[strlen(cstr)+strlen(q.cstr)+1];
strcpy(s.cstr,cstr);
strcat(s.cstr,q.cstr);
return s;
}
CString CString::operator =(const CString &q)
{
if(this!=&q)
{
if(cstr)
delete[] cstr;
cstr = new char[strlen(q.cstr)+1];
strcpy(cstr,q.cstr);
}
return *this;
}
テストのために、このCString a = CString("Hello") + CString(" World"); と同じくらい単純なコードを使用しました。
printf(a);
デバッグしようとしましたが、ある時点で迷子になります。最初に、「hello」と「world」のコンストラクターを 2 回呼び出します。次に、 + 演算子で取得しますが、これで問題ありません。次に、空の文字列のコンストラクターを呼び出します。その後、「CString(CString& str)」に入り、今は迷っています。なぜこうなった?この後、「Hello World」を含む文字列がデストラクタにあることに気付きました (数回続けて)。再び私は非常に困惑しています。char* から Cstring に再度変換した後、前後に停止します。= 演算子に入ることはありませんが、それ以上進むこともありません。printf(a) には到達しません。
これにはVisualStudio 2010を使用していますが、基本的には標準のC++コードにすぎないため、それほど大きな違いはないと思います