Last Updated 2004/03/24
Programming Tips Visual C++ MFC CString(文字列)  索 引 
CStringを返す関数
2004/03/24

C言語でいうところの文字列(char配列)は関数の戻り値とすることはできない.

char *MakeString()
{
    char sMoji[100];
    strcpy( sMoji, "aaa" );
    return sMoji;
}

sMoji は自動変数であり関数を抜けると消滅する.(実際これで動作する環境は多いですが間違いです)

同じように CStrnig を返す関数は作れるのだろうか?

CString MakeString()
{
    CString sMoji;
    sMoji = "aaa";
    return sMoji;
}

これも sMoji は自動変数なので消滅する.
しかし CString は呼び出し元に対してちゃんと文字列をコピーする.
これは CString がそう作られているからだ.
(int などの自動変数を return しても問題がないのと同様)

クラスはコピーコンストラクタなどが実装されていれば問題はない.
オブジェクトの代入などではコピーコンストラクタや operator = が呼び出される.CString はそのようなつくりになっている.
通常のクラスであれば参照の度に呼び出されて動作速度が遅くなるが,CString の場合は参照カウントを使って無駄なコピーが発生しないようなつくりになっているのでそれほど気にする必要はない.
前後のTips
CStringを返す関数

DSS ProgrammingTipsCGI Ver2.01