ホーム » スタッフ » 斉藤徹 » 講義録 » オブジェクト指向 » 参照渡しを積極的に使う

2020年10月
 123
45678910
11121314151617
18192021222324
25262728293031

最新の投稿(電子情報)

アーカイブ

カテゴリー

参照渡しを積極的に使う

オブジェクト指向のレポート課題を採点していると、若干きになることがあったので、補足説明。

複素数クラスのレポート課題で、add() などのメソッドが、私がサンプルコードで示したのがそうなっていたのが原因だと思うけど、以下のようなコードとなっている。

class Complex {
   // 略
public:
   void add( Complex z ) { re += z.re ; im += z.im ; }
   //        ~~~~~~~~~ 値渡し
} ;

処理速度の効率を考える場合は、以下のような参照型(参照渡し)を使うのが一般的。上記のような値渡しだと、機械語を生成する際には、実引数の複素数のコピーが行われるので、無駄な処理が発生しがち。参照型を使えば実引数をコピーする手間が不要なので、処理の無駄が省ける。(Complexのような簡単なクラスなら無駄というほどのものじゃないけど)

class Complex {
public:
   void add( const Complex &z ) { re += z.re ; im += z.im ; }
   //        定数型 ~~~~~~~~~~参照渡し
} ;

ただ、上記の参照型を使うと、addメソッドで、zの内部を書き換えるような間違った処理を記述してしまうと、add()の処理で実引数に副作用が発生する。このため、こういった書き間違いによる影響がないことを明示するために、上記のように、z に const 指定子を記載しておくのが一般的。const がついていれば、addメソッド内部で間違って、zを書き換えるような処理を記載しても、コンパイラが間違いを指摘してくれる。