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

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

Copy1.cppの
for(int i = 0; i < array0to9.Size(); ++i)
{
array0to9.Set(i, i);
}

の意味が分かりません。すみませんが教えていただけないでしょうか?
上記のfor文がある場合は、
コンストラクタが呼ばれました。要素数は 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でした

となります。コメントアウトすると、0 0 0 0 0 0 0 0 0となります。
なぜ、上記のfor文があると、0 1 2 3 4 5 6 7 8 9 と
表示されるのでしょうか? すみません、どなたかよろしくお願いいたします。

//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/09 12:12:03
  • 終了:2009/06/09 13:48:45

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/06/09 13:25:59

ポイント35pt

これは配列のサイズだけループ処理を行っており、

配列の各要素に要素のインデックスと同じ数値を設定する処理です。

for(int i = 0; i < array0to9.Size(); ++i)
{
    array0to9.Set(i, i);
}

両方に i が使用されているのでわかりずらいですが、

    array0to9.Set(i, v);

のように表記すると Set は配列の n 番目の要素に v を設定するという関数ですから、これを


    array0to9.Set(i, 100);
    array0to9.Set(i, i * 20 );

のように変えてみたら、働きが分かりませんか。


for 文の処理以外に疑問があるようでしたら、コメントください。

id:gbs01

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

2009/06/09 13:47:02

その他の回答(1件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/06/09 13:25:59ここでベストアンサー

ポイント35pt

これは配列のサイズだけループ処理を行っており、

配列の各要素に要素のインデックスと同じ数値を設定する処理です。

for(int i = 0; i < array0to9.Size(); ++i)
{
    array0to9.Set(i, i);
}

両方に i が使用されているのでわかりずらいですが、

    array0to9.Set(i, v);

のように表記すると Set は配列の n 番目の要素に v を設定するという関数ですから、これを


    array0to9.Set(i, 100);
    array0to9.Set(i, i * 20 );

のように変えてみたら、働きが分かりませんか。


for 文の処理以外に疑問があるようでしたら、コメントください。

id:gbs01

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

2009/06/09 13:47:02
id:yo-kun No.2

yo-kun回答回数220ベストアンサー獲得回数302009/06/09 13:15:37

ポイント35pt

こんにちは。

本件ですがコピーコンストラクタの理解は関係ありません。


IntArrayは内部でintの配列を持っているだけのクラスです。

コンストラクタで配列のサイズを指定し、Size()メソッドでサイズを取得できます。

Get(int i)で配列のi番目の要素を取得でき、Set(int i, int value)で配列のi番目の要素をvalueに設定できます。


さて、mainを見てみましょう。

最初にIntArrayのコンストラクタに10を渡してIntArrayを一つ作っています。

この時点でarray0to9.Size()は10になっています。


従ってfor文はiを0から9まで10回繰り返します。

array0to9.Set( 0, 0 );

array0to9.Set( 1, 1 );

array0to9.Set( 2, 2 );

array0to9.Set( 3, 3 );

array0to9.Set( 4, 4 );

array0to9.Set( 5, 5 );

array0to9.Set( 6, 6 );

array0to9.Set( 7, 7 );

array0to9.Set( 8, 8 );

array0to9.Set( 9, 9 );

と書くのと同様です。

それぞれ、

配列の0番目の内容を0にする、

配列の1番目の内容を1にする、

配列の2番目の内容を2にする、

配列の3番目の内容を3にする、

...

ということです。

このarray0to9がコピーされてShowに渡されるので出力が0 1 2 3 4 5 6 7 8 9となるのです。


ちなみにfor文をコメントアウトすると、配列が確保され値が設定されないままとなります。

gbs01様の処理系では0 0 0 0 0 0 0 0 0となるようですが、

C++の仕様として、初期化されていない配列の中身が何になるかは保証されません。

絶対に0 0 0 0 0 0 0 0 0となると考えてはいけないということです。

id:gbs01

なるほど、丁寧にありがとうございます。助かりました。

2009/06/09 13:48:05

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

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

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

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

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