c++primerノートを読む関数

5399 ワード

関数#カンスウ#
パラメータ伝達
  • パラメータの初期化は変数の初期化と同様であり、パラメータに非参照タイプがある場合、実パラメータの値をコピーする.シェイプパラメータが参照タイプの場合、実パラメータの別名にすぎません(この文では、パラメータが非参照タイプの場合、実パラメータの値を関数で変更することはできません.ポインタについても同様です.パラメータがポインタの場合、ポインタがオブジェクトを指す値を関数で変更するしかありませんが、ポインタ自体の値を変更することはできません.この場合のパラメータは実パラメータのポインタの複素数にすぎません.製)
  • 関数のパラメータがconstオブジェクトを指すポインタである場合、その関数に渡される実パラメータは、constオブジェクトではないポインタではありません.非constオブジェクトを指すポインタはconstオブジェクトを指すことができず、constオブジェクトを指すポインタは非constオブジェクトを指すことができるが、非constオブジェクトの値を変更することはできない.この場合、この関数により、オブジェクトの値を変更することもポインタ自体の値を変更することもできない
  • となる.
  • パラメータのコピーを行うと時間コストがかかるため、パラメータをコピーしたくないが、関数に実パラメータの値を変更させたくない場合は、パラメータをconst参照として定義することで、この目的を達成することができます.
  • は、constの特性と矛盾するため、constが参照しないパラメータの関数にconst型オブジェクトを渡すことができない.したがって、非const参照パラメータは、同じタイプの非constオブジェクトにのみ関連付けられます.したがって、修正を必要としない対応する実パラメータをconst参照
  • として定義すべきである.
  • ポインタへの参照を渡す(void pterswap(int*&v 1,int*&v 2))
  • int*&v 1は、ポインタが指すオブジェクトではなく、int型オブジェクトを指すポインタに関連付けられているv 1と理解することができるので、ポインタv 1はポインタv 2が指すオブジェクトを指し、v 2はポインタv 1が指すオブジェクトを指すので、ポインタの入れ替えを実現することができる.
  • 通常、関数はvectorまたは他の標準ライブラリコンテナタイプをパラメータとして使用しません.通常の非参照コンテナパラメータを含む関数を呼び出すには、コンテナ内の各要素を割り当てる必要があるからです.コンテナをパラメータとして使用する必要がある場合は、通常2つの方法があります.
  • コンテナタイプのパラメータを参照タイプとして宣言し、要素のコピーを回避するためにパラメータを直接操作します.
  • は、容器において処理すべき要素を指す反復器によって容器
  • を伝達する.
  • 配列を処理する関数は、通常、配列内の要素を指すポインタを操作することによって配列を処理します.この理由は2つあります.
  • 配列は複製操作ができない
  • .
  • 配列名を使用すると、配列名はその最初の要素を指すポインタ
  • に自動的に変換されます.
  • コンパイラが配列パラメータに関連付けられた実パラメータをチェックすると、実パラメータがポインタであるかどうか、ポインタのタイプと配列要素のタイプが一致しているかどうかのみがチェックされ、配列の長さはチェックされません.ただし、配列パラメータが配列の参照として宣言されている場合(void printValue(int(&ary)[10])、コンパイラは配列パラメータをポインタに変換するのではなく、配列参照自体を渡します.この場合、コンパイラは、配列の実パラメータのサイズがパラメータのサイズと一致するかどうかをチェックします.
  • 配列パラメータ定義の3つの等価方式
  • void printValues(int*){·····}
    void printValues(int []){·····}
    void printValues(int [10]){·····}   //        
    //       ,    ,     ,                  (        ,          ,                )
  • 多次元配列の場合、1次元以外のすべての次元の長さは要素タイプの一部であり、定義方法は2つの
  • であることを明確に指定する必要がある.
    void printValues(int (matrix*)[10]);        //       10 int      
    void printValues(int matrix[][10]);

    return文
  • ローカルオブジェクトの参照とポインタは絶対に返さないでくださいが、ローカルオブジェクト自体を返すことができます.これは、リファレンスとポインタの場合、関数が終了するとローカルオブジェクトが解放され、リファレンスとポインタがオブジェクトに関連付けられているため、返されるリファレンスとポインタは不確定なメモリを指します.ただし、ローカルオブジェクト自体は関係ありません.ローカルオブジェクト自体を返すため、実際にはローカルオブジェクトのレプリケーションを返します.この場合、ローカルオブジェクトが関数の終了後に解放されても、そのレプリケーションは存在しますので、関係ありません.ローカルオブジェクトの参照とポインタは、オブジェクト自体の複製
  • ではなく、参照とポインタの複製を返すため、異なる.
    静的ローカルオブジェクト
    静的ローカルオブジェクトとは、変数が関数の役割ドメイン内に存在するが、ライフサイクルがこの関数の複数回呼び出されることを意味します.すなわち、オブジェクトが作成されると、プログラムが終了するまで取り消されません.staticでオブジェクトを宣言します
    int count(){
        static int ctr = 0;
        return ++ctr;
    }
    int main(){
        for(int i = 0; i != 10; ++i)
            cout << count() << endl;
        return 0;
    }
    //      1 10, 10  ,   10 0,            ,           

    インライン関数
    小さな操作定義関数のメリット
  • 関数を使用すると、
  • がより理解しやすくなります.
  • 変更が必要な場合は、関数を変更するには、より多くの
  • コンテナを使用します.
  • 関数を使用することで、統一的な動作を確保することができ、各テストは
  • を同じ方法で実現することを保証することができる.
  • 関数は、他のアプリケーションのためにコード
  • を書き換える必要がなく、再利用可能である.
    インライン関数を使用する理由
    関数を呼び出すと、まずレジスタを保存してから実パラメータをコピーし、新しい位置実行関数に移行し、最後にレジスタを復元する必要があります.これにより、直接実行関数の文よりも時間コストがかかります.この問題を解決するために、インライン関数を提案しました.
    インライン関数とは
    関数をインライン関数として指定すると、プログラム内の呼び出しポイントごとにインラインの展開が行われます.関数がタイプを返す前にキーワードinlineを付けることで、この関数をインライン関数として指定できます.
    インライン関数の使用範囲
    通常、インラインメカニズムは、数行のみで頻繁に呼び出される関数を最適化するのに適しています.ほとんどのコンパイラでは、再帰関数をサポートしないインライン関数は、通常、ヘッダファイルで定義する必要があります.これにより、すべてのソースファイルで定義が同じであることが保証され、呼び出しポイントでコンパイラに表示されることが保証されます.
    さいかかんすう
    リロード関数の概要
    リロード関数とは、同じ役割ドメイン内で、同じ名前を持つが異なる2つの関数です.
  • ここの形参には以下のような状況があります.
  • パラメータの個数は同じだがタイプは異なる
  • パラメータタイプは同じだが個数は異なる
  • パラメータタイプと個数が異なる
  • 同じ役割ドメイン内にない場合、ローカル役割ドメイン定義関数は、
  • を再ロードするのではなく、外層役割ドメイン定義の同じ名前の関数をマスクする.
    note
  • 関数は、戻り値の違いだけに基づいてリロード
  • を実現することはできない.
  • main関数は
  • を再ロードできません.
  • パラメータについては、非参照のconstオブジェクトと非参照の非constオブジェクトが同じパラメータとみなされます.これは、実パラメータを渡す際に、非参照オブジェクトについてはconstでも非constでもコピー操作が行われるため、constという特性は直接無視されるため、非参照オブジェクトについては、constと非constは同じパラメータとみなされ,そのリロードは実現できない.
  • 参照型オブジェクトとポインタ型オブジェクトについては、constであるか否かが異なる.これは、参照型オブジェクトについては、その関連するオブジェクト本体が渡されるため、constと非constのどちらが実行できるかの操作が全く異なり、同様に、非constの対象を指すポインタとconstの対象を指すポインタも全く異なるこのとき、この2つのパラメータの違いにより、リロード
  • を実現することができる.