トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
C++
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索

___

■ 参照(Reference)


    Reference とはオブジェクトの別名のこと。
    関数の引き数の参照渡しでよく使う。


       // 参照 渡し
       // const obj は変更不可
       //float func( float &foo )
  {  
    float foo = 0.0f;
  
    // bar は float 型としてうけとる( うけとることが可能 )
    // bar, foo は別モノ
  #if 0
    float bar = func( foo );
  #else
    // foo の別名となる
    float &bar = func( foo );
  #endif  
    bar ++;

    printf( "foo[ %f ]\n", foo );
    return 0;
  }
引数渡し、返り値、共に普通に渡せばOK
    {
      int &foo( int &b ){
      static int a;
      return a;
      }
    }
    
    int c = 77;
    int &d = foo( c );  // 普通に渡す && 普通に受け取る
    d = 12; // a = 12 になる    

    int d = foo( c );   // 参照としてうけとらない場合は、int 型を返しことと同一
    d = 12 // a = 0 のまま
  POINT
    private 変数 を参照返しすることで、get, set 相当のことをする

      private:
  int x;
      public:
  int &getX()( return x; )

  WARNING 
    ローカル変数の参照を返してはいけない ( ∵ 参照先は消滅 )

    STL vector< int> arr[i] はローカル変数なので、参照として返してはいけない

  std::vector< int> arr
  return arr[i];  // ERROR;

    参照変数 は定義する際に、初期化が必要( ∵ 変数の別名, compiler の立場で考えれば自明 )

    ERROR
    int &foo;
    int a;
    foo = a;
    
    OK
    int a;
    int &foo = a;

  // 参照 の考察  
    {
    int b = 7;
    int c = 10;

    int &a = b;   // b は a ともいう
    a = c;        // a に代入 == b に代入
    
    cout < <  b;     // RET 10
  }
// cls の member で reference がある場合は, 初期化list でおこなうこと
___

■ リファレンスの初期化

リファレンスを作成する場合はリファレンス先への参照が必須になる。
      ref の初期化時点 ( 逆に初期化が必須 )

      // BAD
      int &k;
      // OK
      int &j = i;

___

■ リファレンスとポインタの違い

POINT ポインタを定義するとポインタ型の別オブジェクトができる。 リファレンスは既存のオブジェクトの別名なので新規のオブジェクトはできない。
___

■ リファレンスを返す

リファレンスを返すことで、関数コールは左辺値となる。
      class Array
      {
        public:
         float &operator[] ( unsigned int i ) throw( outOfRange );
        private
         float data[100];
      };

      arr::operator[]( unsigned int i )throw( outOfRange )
      {
          if ( i>=100 ){
            throw outOfRange("array idx is out of range");
          }
          return data[i];
      }

      {
        Array a;

        // 左辺値に値 7 を代入する
        a[10]= 7;       // obj::data を変えることを意味
      }


NINJAIDX 12