C++言語初心者です。コピーコンストラクタのところが分かりません。

どなたかご教授お願いします。

Copy1.cppのvoid Show(IntArray array) { hoge }
のIntArray arrayが評価されて、IntArray.cppの
IntArray :: IntArray(const IntArray &other)
{
m_array = new int[other.m_size]; //配列の動的確保, otherオブジェクトの値を使う
m_size = other.m_size; //otherオブジェクトの値をコピーs

copy(other.m_array, other.m_array + m_size, m_array);

cout << "コピーコンストラクタが呼ばれました。" << endl;
}
が実行されるのだと思います。
ただ疑問点は、void Show(IntArray array) { hoge }を
void Show(const IntArray array) { hoge }というふうにconstをつけてはいけないのでしょうか?

実行結果
コンストラクタが呼ばれました。要素数は 10です。
Viss : No.1
コピーコンストラクタが呼ばれました。
Viss : No.2
0 1 2 3 4 5 6 7 8 9
Viss : No.3
デストラクタが呼ばれました要素数は10でした
Viss : No.4
デストラクタが呼ばれました要素数は10でした

//IntArray.h
http://d.hatena.ne.jp/gbs01/20090609/1244516347

//IntArray.cpp
http://d.hatena.ne.jp/gbs01/20090609/1244516346

//Copy1.cpp
http://d.hatena.ne.jp/gbs01/20090609/1244516345

回答の条件
  • 1人5回まで
  • 登録:2009/06/10 06:57:44
  • 終了:2009/06/10 17:56:52

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/06/10 17:08:41

ポイント60pt

コンストラクタというよりは const 修飾子の話だと思うのですが、


まず文法的な点からですが、

Show( IntArray array ) を Show( const IntArray array ) とすると、コンパイル時に

警告が出るかと思います。

これは、const モジュールが処理時に const 外のプロパティ(Size, Get)を呼び出して

いるためで、この処理がないのであれば、Show(...)の引数は const があってもなくて

も構いません。

http://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/c...


しかし、処理としての点から述べると、関数の引数でポインタ渡し以外で const 修飾子を

使用するのはたいていの場合意味がありません。

ポインタ渡しの場合、ポインタ変数自体やアドレスの指す中身を書き換えないようにする

目的で使用しますが、値渡しの場合関数処理が終了した段階で変数領域は解放されますから、

これを保護する意味がありません。

http://homepage2.nifty.com/well/const.html


ですから結論としては、Show 関数で const 修飾子を使用するのは適切ではありません。


蛇足ながらコピーコンストラクタに関しては、明示的に実行されるものではなく、インス

タンスが生成されるタイミングで自動的に実行されます。

上記でも述べましたが、C/C++では関数の引数は値渡しですので、関数が実行されたタイ

ミングで引数のインスタンスが生成されます。

ですから、コピーコンストラクタは Show 関数の実行時に実行されています。

http://www.booran.com/menu/cplus/copyconst.html

id:gbs01

なるほど、ありがとうございます。

2009/06/10 17:11:48

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません