C++Primer(英語第5版)日記を読む-20200417やっとcppポインタと定数の定義を理解しました

11302 ワード

前言
第二章は少し長いですが、今日も頑張りましょう.
const Qualifier
変数宣言の前にconst制限子を付けると、将来予想できない修正(同僚.jpg)を防ぐことができます.
const int bufSize = 512;

また、初期化の際には、明示的に初期化されなければならない.また,constで定義された変数は,修正不可以外は元のtype表現形式と一致する.
int i = 42;
const int ci = i;
int j = ci;

const限定の整数はコンパイル時にhard codeになります.この点システムはOSを学んだほうが分かりやすい.そのため、異なるファイルをコンパイルする場合、const制限定数は複数回初期化されます.1つのファイル内で定義し、他のファイルで彼を使用するにはexternを使用する必要があります.
// in file_1.cc
extern const int bufSize = fcn();
// in file_1.h
extern const int bufSize; // same bufSisze as defined in file_1.cc

definitionとdeclarationの違いを振り返る:defineは多く見られる.cファイル、実現機能;declarationは多く見られますhファイル.変数名を宣言します.しかしconst制限子の下の定数は、declarationの時にdefineしなければならず、分離できません.
const & reference
定数をどのように参照しますか?
const int ci = 1024;
const int &r1 = ci; // ok
r1 = 42; // error: r1      ,    
int &r2 = ci; // error:   ,          

bind a const reference to
  • a nonconst object
  • a literal
  • a more general expression
  • int i = 42;
    const int &r1 = i;
    const int &r2 = 42; // reference to a literal
    const int &r3 = r1 * 2; // reference to a nonconst variable
    int &r4 = r * 2; // error: r4 is a plain, non const reference
    

    Const reference may refer to a non-const object. Const referenceは引用したobjectとは関係なく,我々の彼に対する行為を限定している.
    Nonconst referenceはconferenceがillegalであることを指します.
    Pointersとconst
    A pointerはconstまたはnonconstを指すことができる.
    const double pi = 3.14; // pi is const;
    double *ptr = &pil; // error: ptr is a plain pointer
    const double *cptr = π // ok: cptr       const double,  const   ,               
    *cptr = 42; // error
    double dval = 3.14;
    cptr = &dval; // ok: but cannot change dval through cptr
    

    次に、騒々しい操作を見て、右から左へのポインタを理解します.
    // Example 1: const pointer
    int errNumb = 0;
    int *const cirErr = &errNumb; //         ,    errNumb
    // Exapmle 2: const pointer of a const
    const double pi = 3.14159;
    const double *const pip = π //         ,      pi
    

    ここで最後の1つはやはり近くから遠くまで理解しています.
  • pip pip
  • という変数を定義しました
  • const pip定数pip
  • を定義しました
  • *const pip定数pipを定義しました.彼はポインタです.pipは定数ポインタ
  • です.
  • double *const pip定数ポインタpipを定義しましたdouble
  • を指しています
  • const double *const pip定数ポインタpipを定義しました.彼は定数double
  • を指しています.
  • const double *const pip = π定数を定義したので、初期化しなければなりません.彼は定数doubleを指すポインタなので、定数doubleのアドレスを割り当てなければなりません.

  • ポインタ自体がconstである場合、top-level constと呼ばれます.ポインタが指す内容が定数の場合、low-level constと呼ばれます.
    When copy an object, top-level ocnsts are ignored. Low-level const is never ignored.
    constexpr and Constant Expressions
    A const expression is an expresssion whose value cannot change and that can be evaluated at compile time.
  • A literal is a constant expression.
  • A const object that is intialized from a const expression is a const expression. objectがconst expressionであるかどうかは、彼のtypeとintializersに依存します.
  • const int max_files = 20; // yes
    const int limit = max_files + 1; // yes
    int staff_size = 27; // no: type not const
    const int sz = get_size(); // no: initializer not const
    

    実際、実際のcodingでは、コンパイラに判断を補助させることができます.constexprは、私たちの変数に対応するinitiailizerがconst expressionであるかどうかを判断します.
    constexpr int mf = 20;
    constexpr int limit = mf + 1;
    constexpr int sz = size(); // ok only if size is a constexpr function
    

    Pointers and constexper constexpr imposes a top-level const on the objects it defines.
    const int *p = nullptr; // p is a pointer to a const int
    constexpr int *q = nullptr; // q is a const pointer to int
    

    実はここで、私はconstとconstexprの役割についてよく理解していません:constexprは少し余計な感じがします.私は他のブログを調べて、このブログはいくつかの観念を提出しました.
  • は、プログラムの正確な意味が破壊されないことをよりよく保証する強い制約である.
  • コンパイラは、コンパイル期間中にconstexprのコードを非常に大きく最適化することができ、例えば、使用されるconstexpr式を最終結果に直接置き換えるなどします.
  • マクロに比べて、追加のオーバーヘッドはありませんが、より安全で信頼性があります.