C++Primer(英語第5版)日記を読む-20200417やっとcppポインタと定数の定義を理解しました
11302 ワード
前言
第二章は少し長いですが、今日も頑張りましょう.
const Qualifier
変数宣言の前にconst制限子を付けると、将来予想できない修正(同僚.jpg)を防ぐことができます.
また、初期化の際には、明示的に初期化されなければならない.また,constで定義された変数は,修正不可以外は元のtype表現形式と一致する.
const限定の整数はコンパイル時にhard codeになります.この点システムはOSを学んだほうが分かりやすい.そのため、異なるファイルをコンパイルする場合、const制限定数は複数回初期化されます.1つのファイル内で定義し、他のファイルで彼を使用するにはexternを使用する必要があります.
definitionとdeclarationの違いを振り返る:defineは多く見られる.cファイル、実現機能;declarationは多く見られますhファイル.変数名を宣言します.しかしconst制限子の下の定数は、declarationの時にdefineしなければならず、分離できません.
const & reference
定数をどのように参照しますか?
bind a const reference to a nonconst object a literal a more general expression
Const reference may refer to a non-const object. Const referenceは引用したobjectとは関係なく,我々の彼に対する行為を限定している.
Nonconst referenceはconferenceがillegalであることを指します.
Pointersとconst
A pointerはconstまたはnonconstを指すことができる.
次に、騒々しい操作を見て、右から左へのポインタを理解します.
ここで最後の1つはやはり近くから遠くまで理解しています. という変数を定義しました を定義しました です. を指しています を指しています.
ポインタ自体が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に依存します.
実際、実際のcodingでは、コンパイラに判断を補助させることができます.
Pointers and constexper
実はここで、私はconstとconstexprの役割についてよく理解していません:constexprは少し余計な感じがします.私は他のブログを調べて、このブログはいくつかの観念を提出しました.は、プログラムの正確な意味が破壊されないことをよりよく保証する強い制約である. コンパイラは、コンパイル期間中にconstexprのコードを非常に大きく最適化することができ、例えば、使用されるconstexpr式を最終結果に直接置き換えるなどします. マクロに比べて、追加のオーバーヘッドはありませんが、より安全で信頼性があります.
第二章は少し長いですが、今日も頑張りましょう.
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
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.
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は少し余計な感じがします.私は他のブログを調べて、このブログはいくつかの観念を提出しました.