C++学習の参照

2489 ワード

1.引用の定義と意味
a.参照の定義
参照は初期化する必要があります.参照が定義されると、他のオブジェクトを指すことができないため、初期化が必要です.
type & quote_name=var_name;

ただし、リファレンスはリファレンスオブジェクトのアドレスで初期化できません.オブジェクトのアドレスを参照する場合は、ポインタ参照を定義できます.
b.引用の意味
int a=10;
int &b=a;

ここで、bは参照であり、bは実際にはaのアドレスを指しているが、ポインタではなく、参照であり、aの別名であり、aができるbはすべてできる.
2.参照の適用
実際の応用では,参照は主に関数の形式パラメータとして用いられる.リファレンスは、オブジェクトの別名であるオブジェクトのアドレスを内部に格納します.文字列定数や異なるタイプのオブジェクトなどのアドレス不可能な値の場合、コンパイラはリファレンスを実現するために一時オブジェクトを生成する必要があります.リファレンスは実際にオブジェクトを指しますが、ユーザーはアクセスできません.このとき,参照が関数パラメータとして用いられるとconst参照問題が導入される.
3.const引用問題
  • constリファレンスは、タイプ間でデフォルトで変換できる限り、異なるタイプのオブジェクトで初期化できます.文字列定数などのアドレス不可の値でも構いません.const引用でなければだめです.
  • double  dvar=2.12;
    int     & nvar=dvar;             //Wrong
    int     const& cnvar=dvar;       //OK
    double  & cdqvar=dvar+1.0;      //Wrong
    double  const& cdqvar=dvar+1.0;  //OK
  • コンパイラは、リファレンスを処理するときに、次のように変換して一時オブジェクトを生成します.
  • double  dvar=2.12;
    int     const& cnvar=dvar;
    ///     --Beg
    int     tmp=dvar;           //double -> int
    int     const& cnvar=tmp; 
    ///End
  • では、コンパイラが一時変数を生成するときに参照がconstである必要がある一時オブジェクトまたは値を指すことは許可されません.
  • int nvar=100;
    int * &pqvar=&nvar;      //Wrong , &nvar           ,     const
    int * const & pcqvar=&nvar; //OK
    
    int const nvar0=100;
    int * &pqref=&nvar0;    //Wrong,  const      
    int const * &pcqref=&nvar0; //Wrong,       ,   nvar0     ,          ,       nvar0  , pcqref        
    int const * const &cpcqref=&nvar0; //OK
    int const *p = &nvar0;
    int const * &ref = p;  //OK

    注意:定数ポインタとポインタ定数
    int a;
    int * const p = &a    //    ,*p    :*p = 8;(OK)
                          //p     : p++;(ERROR)
    int a,b;
    const int *p = &a;   //    ,*p    :*p = 8;(ERROR)
                          //p     : p = &b  (OK)

    まとめ:
  • 非const参照が一時オブジェクトを必要とするオブジェクトまたは値
  • を指すことは許されない.
  • アドレス値はアドレス不可の値
  • である.
  • constリファレンスは、このリファレンスによってリファレンスのオブジェクトの値を間接的に変更しようとすると、コンパイラがエラーを報告することを示します.これは、元のオブジェクトもconstタイプになったわけではありません.元のオブジェクトでオブジェクトの値を変更し、参照オブジェクトの値を変更する目的を達成することができます.
  • int nvar=100;
    int const &ref=nvar;
    nvar++;     //OK
    //ref++;    //Wrong
    cout<<nvar<<endl<<ref<<endl;
    ///  :
    101
    101

    ふろく
  • GitHub-Blog