KENスクールブログ | パソコン教室・パソコン講座なら個別指導のKENスクール

BLOGKENスクールブログ

  1. KENスクール TOP >
  2. KENスクールブログ > プログラム > C++の紹介2【中級者向け】

プログラム

C++の紹介2【中級者向け】

https---www.pakutaso.com-assets_c-2015-06-LISA78_MBAsawaru20141018102912-thumb-1000xauto-17983

一般的に難しいといわれているC++を紹介した記事です。
基本文法や変数、オブジェクトの概念を習得済みの中級者向けの記事です。

前回は、C++でのオブジェクトの取り扱いについて紹介しました。Javaとは異なり、代入は実体のコピーであるという内容です。
今回は、その代入(データのコピー)についてもう少し詳しく見て行きます。

前回同様、上記のクラスを使って話を進めて行きます。

このプログラムの実行結果は、画面に100と表示されます。イコール演算子による代入でm1の内容がm2にコピーされたからです。
それでは今回の本題ですが、イコール演算子を使用しない場合でも代入が行われる(代入と同じくオブジェクトがコピーされる)場合があります。それはどのような時でしょうか。

それは、関数(メソッド)を使ってデータをやり取りした場合です。

オブジェクトを使わない、単純なデータ型でのサンプルコードで見て行きましょう。

func()関数はint型を受け取り、int型を返す関数です。関数内で変数argに100を加算していますが、変数valには影響しません。
このとき、変数valから変数argへ、変数retから変数ansへ、関数内では変数argから変数retへ、データが受け渡されています。特に意識していなかった人も居るかもしれませんが、この引数および戻り値のやり取りもデータのコピーが行われているのです。

それでは、オブジェクトを使った関数の例を見て行きましょう。

このときも、変数valから変数argへ、変数retから変数ansへ、関数内では変数argから変数retへ、データが受け渡されており、それぞれの場所でデータのコピーが行われています。

今回、Myclassはサンプルとしてのクラスなので、int型変数を一つと、それに関する関数を三つ持っているだけですが、実際には多くの変数や関数を含むクラスになります。
そのときに、関数に渡すたびにコピーをしていてはメモリの無駄ですし、コピーをする処理の時間も無駄です。

Javaではこのような書き方をしたとき、オブジェクトの参照情報のコピーを渡すので、実際にオブジェクトに含まれるデータのコピーは作成されません。C++ではデータのコピーを作らず、そのデータの場所の情報を受け渡すときはポインタを使います。(参照渡しというのもありますが、それは別の機会に。)

下記のサンプルはデータのコピーを作らない、ポインタでのデータのやり取りです。

表示結果は一つ前のサンプルと同じですが、データをコピーしていない点で異なります。
main()関数の最後の行を val.printValue(); としても同様の結果になります。

Javaではオブジェクトの受け渡しは参照型のみで行われますが、C++では標準的には実体のコピーで行われ、ポインタを使うことでJavaの参照情報のやりとりと同様のことができるようになります。

この記事に関連する講座

実践的なGUIプログラミングを習得!

詳しくはこちら