// ( r9.C ) // 参照型引数の例 // #include // 例題1 void sub1( int j,int& i ) // & の位置に注意。i の引数の指定 int &i でもよい。 { // ANSIでは int& i の方を推奨している。 i = j*2 ; } // & はアドレス演算子と言って、i=j*2 の i はアドレス // であってその実体は外にある。このため関数のスタッ void sub2( int& i ) // クに変数をコピ−する手間が省けるため効率がよい。 { i = i*2 ; } void sub3( const int& i ) { // i = 10 ; 変数 i は const 指定されているため、関数の中で値の変更はできない。 } // 例題2 class PPP { int* p ; int m ; // 変数を const 宣言すると、その関数の中では値を変更 public: // できなくなる。 PPP() {} void set1( int* j ) { p = j ; } // const int* はできない void set2( const int& j ) { m = j ; } void print_n() { cout << *p << endl ; } void print_m() { cout << m << endl ; } } ; /* 以下の定義のやり方は、分かりにくいためしない方がいい void set1( int j ) { p = &j ; } const int はできない void set2( int& j ) { p = &j ; } const int& はできない */ main() { // 例題1 int i ; sub1( 2,i ) ; cout << i << "\n" ; // 4 int j = 3 ; sub2( j ) ; cout << j << "\n" ; // 6 : j の値が変わってしまっている! // 例題2 PPP p ; int k = 20 ; p.set1( &k ) ; p.print_n() ; // 20 p.set2( k ) ; p.print_m() ; // 20 } /* [参考] void set2( const int& j ) { ... は j という値を入力としてのみ機能させるという 意味になる。そのためル−チンの中で値を変更させようとすると、コンパイル・エラ− になる。入力値であると明示するのに用いると便利である。 */