人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: gbs01
●カテゴリ:コンピュータ 学習・教育
✍キーワード:C++ const hoge void オブジェクト
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Mook
●60ポイント ベストアンサー

コンストラクタというよりは 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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ