C++primer第七章ノートまとめ


C++Primerの第7章を見終わって、この章は見られてから見る価値があると思って、今いくつかの総括を書いて、できるだけ知識点を網羅して、しかし決して冗長ではありませんて、簡単で分かりやすいように努力します.
第七章のテーマは関数です.
定義:
int  add ( int  x, int  y) {}
前のintは戻りパラメータタイプです.関数は定義時に関数の戻りタイプを宣言する必要があります(クラスの構造関数および構造関数を除く)
addは関数名であり、関数のアドレスでもある.(この文は重要です):
カッコ内はパラメータテーブルで、ここで定義され、関数呼び出し時に初期化されます.
{内は関数体である.関数体自体は役割ドメインを構成します.役割ドメインの原則に従う.
パラメータの転送:
非参照パラメータ:パラメータを初期化すると、実パラメータは大丈夫です.関数体の操作はすべてパラメータのことです.
1ポインタパラメータ:ポインタの値(あるもののアドレス)をパラメータに割り当てると、実パラメータが指すもののアドレスをパラメータに与えることに相当し、パラメータはポインタが指す値を操作します.パラメータにconstがある場合は、変更は許可されません.
例:
void changePtrTo(int *p)
{
     *p = 1; //p          (      ),        
       p = 0; //p      
}
constに追加されたパラメータについては、関数内部でこの形式のパラメータの値を変更することはできないことを示す(値呼び出しであるため)、constまたは非constに渡すことができる.
しかし,実パラメータの値を修正する必要があり,実パラメータのオブジェクトが比較的大きく,コピーに時間がかかり,オブジェクトのコピーが実現できない場合には,参照パラメータが導入される.
参照パラメータ:
関数が2つのコンテンツを返す場合は、1つのコンテンツのポインタまたは参照をパラメータとして使用できます.
大きなオブジェクトのコピーを回避します.
その他のパラメータ:
vectorまたは他のコンテナタイプでは、避けるために、そのコンテナの開始と終了の反復器をパラメータとして直接使用することができます.
配列パラメータ:配列はポインタに劣化し、配列ヘッダのノードを指すポインタです.通常、配列名はポインタとして直接入力されます.ポインタの長さを指定すると、C++コンパイラはそのまま無視されるため、以下の3つの定義は等価です.
void   Func(int *a);
void   Func(int a[]);
void   Func(int a[10]);

しかし、配列の参照が渡されると、配列名はポインタに劣化するのではなく、配列として処理されます.
void   Func(int (&arr)[10] );//           10   !!

多次元配列の伝達については,定義と同様に2次元目のサイズを指定すればよい.
パラメータの数が可変である場合、void foo(parm_list,...)、3点でいいです.
関数の戻り値:
main関数の戻り値は、マシンに依存しないEXIT_を推奨しますSUCCESSとEXIT_FAILURE.
非参照タイプを返し、一時オブジェクト戻りを作成し、呼び出し先に戻ります.
参照タイプを返します.(ローカルオブジェクトへの参照またはローカルオブジェクトへのポインタを返すことはできません)
左の値を返します(こんなのもあるなんて!!) 
int getElem(int A[], int index)
{
  return A[index];
}

上記の関数は配列の要素を返すので、getElem(A,2)=5があります.配列の2番目の要素を5に割り当てることを示します.
関数宣言:
既定のパラメータ:
int add(int x, int y = 0,  int z = 3); //                 !!!

注:デフォルトの実パラメータは、関数宣言と関数定義に1回のみ表示されます.
クラスのメンバー関数:
関数体の内部に定義され、自動的にインライン関数にコンパイルされます.
各クラスのメンバー関数には、暗黙的なパラメータthisポインタがあります.この関数を呼び出すオブジェクトのアドレスを指します.(static以外)
常メンバー関数とは、関数宣言のあるビットにconstを加え、その関数を呼び出すオブジェクトが変更できないことを意味します.
コンストラクション関数:
クラスと同じ名前、戻り値がない、異なるコンストラクション関数には、異なるタイプまたは数のパラメータがある必要があります.
パラメータのないコンストラクション関数をデフォルトコンストラクション関数と呼びます.
コンストラクション関数が定義されていない場合、コンパイラは自動的にデフォルトコンストラクション関数の合成を生成し、クラス内のメンバー変数は独自の初期化方法で初期化されます.(二次初期化の方法は、オブジェクトの定義された位置に依存します.グローバル/ローカル).
さいかかんすう
同じ役割ドメインの下の2つの関数で、同じ名前ですが、パラメータテーブルは異なります.
mainは再ロードできません.
次のような場合は、リロードとは言えません.
int add(int x);
int add(int); //               ,         。
typedef unsigned char BYTE;
int add(unsigned char);
int add(BYTE ); //             
int add(int x, int y = 3);
int add(int x, int y);//          ,                
int add(int x);
int add(const int x);//const         。(           )

constの参照タイプおよびconstを指すポインタがパラメータとして使用される場合、constはリロードのフラグとして使用できます.
≪関数マッチング|Function Matching|emdw≫:リロード関数を呼び出すと、どちらが呼び出されますか.1各実パラメータのマッチングは、他の候補者よりも優れていることに依存する.あるいは、2の少なくとも1つの実パラメータのマッチングが候補者より優れている.
実パラメトリック照合の優先度:
正確な一致-->タイプの移動-->標準変換-->クラスタイプ変換.
int  (*pAdd) (int , int);
関数名をポインタ表示に置き換えると、int型ポインタ式を定義するのと同じです.たとえば、次のようにします.
int x;
int *p;

int add(int ,int);
int (*pAdd)(int , int);

関数名は実際には関数のアドレスであるため、関数名で関数ポインタを初期化することができます.
pAdd = add;
関数ポインタは、関数のパラメータとしてもよいし、戻り値としてもよい.
int (*ff(int))(int *, int);

リロード関数を指すポインタは、リロード自体の不確実性のため、実参加パラメータのマッチングが正確なマッチングであることが要求される.
終わりだ!この章のものは主に関数をめぐって行われていると思います.この章を読み終えて,たいへん利益を得た.