// ( r10.C ) // 返り値の参照型の注意 // #include class Foo { int i ; public: Foo( int n ) { i = n ; } int& get1() { return i ; } const int& get2() { return i ; } // const 指定した方が無難である。 void get3( int& j ) { j = i ; } void get4( int* j ) { *j = i ; } int get5() { return i ; } } ; void main() { Foo a(10) ; // プライベ−トな変数が、何とアクセス出来てしまう。 int* c ; c = &a.get1() ; *c = 100 ; cout << a.get1() << endl ; // 注目:100 になってしまう! Foo b(10) ; int& d = b.get1() ; d = 100 ; cout << b.get1() << endl ; // 注目:100 になってしまう! /* Foo b(20) ; int& d = b.get2() ; // コンスト指定した方は、ここですでに警告が出る。 d = 200 ; // これは実行されない cout << b.get2() << endl ; // 20 の値のまま */ int j ; b.get3(j) ; cout << j << endl ; j = j + 10 ; // 変数 j とメンバ変数 i は別物である。 cout << b.get1() << endl ; int k ; b.get4(&k) ; // 変数 k とメンバ変数 i は別物である。 cout << k << endl ; Foo o(10) ; // 変数 l とメンバ変数 i は別物である。 int l = o.get5() ; cout << l << endl ; } /* [参考] 推奨する方法 class Foo { int i ; public: Foo( int n ) { i = n ; } const int& get2() { return i ; } リタ−ンで返す場合 void get3( int& j ) { j = i ; } 引数で返す場合 */