コピ−コンストラクタ?

[戻る]
ナオーバ 2003/02/19(水) 14:49:50
まだスコープ、コピ−コンストラクタのことが
理解できないでいます。
次の2つの場合、問題は起こるでしょうか?

1
CString C***View::LoadString( UINT uiID )
{
 m_szText.Empty();
 if( m_szText.LoadString( uiID ) )   return m_szText;
 else                                return DEF_BLANK;
}

2.
CString C***View::LoadString( UINT uiID )
{
 CString szText;
 if( szText.LoadString( uiID ) )   return szText;
 else                              return DEF_BLANK;
}
DEF_BLANKはアプリケーションクラスのヘッダに
 const CString DEF_BLANK = "    ";
として設定しています。

これらはコピ−コンストラクタが返されるので、
呼び出し側で使用しても大丈夫なのでしょうか?
不定値にはならないでしょうか?

よろしくお願いします。

επιστημη 2003/02/19(水) 14:59:14
ごめんなさい質問の意味がわかりません。

返されるのは CString です。コピーコンストラクタではありません。

小悪魔恭子 2003/02/19(水) 15:07:55
補足説明
CStringを値返しするときにCString(const CString&)が呼び出されます。

ナオーバ 2003/02/19(水) 15:20:44
すみません、言い直します

関数の内部で宣言した値は関数を出た後にアクセスしてはいけない
ってのが頭にありまして。(これが余計なことかもしれません)

何故ダメなのかがわからずにいます。

CString C***View::LoadString( UINT uiID )
{
 CString szText;
 if( szText.LoadString( uiID ) )   return szText;
 else                              return DEF_BLANK;
}
の場合、szTextは内部で宣言したローカル変数で
関数をでたら(スコープからはずれたら)不定値ですよね?

これをreturn szText;で呼び出し元に返した場合の動作があいまいなのです。

コピ−コンストラクタは全く関係ないのかもしれません。
以前、自作クラスをreturn 自作クラスとしたら、
コピ−コンストラクタがありませんのようなエラーがでたことがあったので
関係あるかもと思っています。

基礎の基礎の部分なのですが、よろしくお願いします。

επιστημη 2003/02/19(水) 15:28:21
> 関数の内部で宣言した値は関数を出た後にアクセスしてはいけない
> ってのが頭にありまして。(これが余計なことかもしれません)

マチガイです。正しくは:

  スコープの内部で定義したautomaticインスタンスを
  スコープの外から参照しては(させては)ならない

  // やってはいけない
  int* f() {
    int i;
    return &i;
  }

コピーコンストラクタが'きちんと'定義されたオブジェクトならば
return時にはその'コピー'を返すので、スコープをまたいでしまう
ことはありません。だから安全。

ナオーバ 2003/02/19(水) 15:37:05
[[解決]]
ありがとうございます。

そうなんですね。
返却値がポインタ、参照の場合は気をつけなければならないのですね
これでやっと理解できました。

ありがとうございました。

dairygoods 2003/02/19(水) 15:42:02
関数の戻り値がオブジェクトである場合、
関数の戻り値用一時オブジェクトがコッソリ作られています。
関数の戻り値用一時オブジェクトの寿命は、関数呼び出しの行が終わるまでです。

CString C***View::LoadString( UINT uiID )
{
 CString szText;
 if( szText.LoadString( uiID ) )   return szText;  // (A)
 else                              return DEF_BLANK;
}

CString a;
a = LoadString(SOME_ID);  // (B)

1.(A)でszTextに対するローカルオブジェクトが作られます。
2.(A)return時に関数戻り値オブジェクトにローカルオブジェクトの内容がコピーされます。
3.関数から抜けるとローカルオブジェクトは破棄されます。
4.(B)でaに関数戻り値オブジェクトの内容が代入されます。
5.(B)の行が終わると関数戻り値オブジェクトが破棄されます。

古いスレッドには追加発言できません。