北京大学MOOC C++学習ノート(一)

3691 ワード

参照:
参照を定義するときは、変数を参照するように初期化する必要があります.
初期化すると、変数はずっと参照され、他の変数は参照されません.
参照は変数のみを参照し、定数と式は参照できません.
double a = 4, b = 5;
double & r1 = a;
double & r2 = r1; // r2     a
r2 = 10;
cout << a << endl; //     10
r1 = b; // r1      b      a = b;
cout << a << endl; //    5

関数としての戻り値を参照
int n = 4;
int & SetValue() {  return n; }
int main()
{
SetValue() = 40;
cout << n;
return 0;
} //   : 40

常引用:参照を定義するとき、constキーを前に付けます.すなわち、「常引用」です.
int n;
const int & r = n;
r      const int &

通常の参照によってその参照の内容を変更することはできません:
int n = 100;
const int & r = n;
r = 200; //    
n = 300; // ok
  • 常引用と非常引用の変換:
  • const T&とT&は違うタイプ!!!T&タイプの参照またはTタイプの変数を使用してconst T&タイプの参照を初期化できます.const Tタイプの定数とconst T&タイプの参照は、強制タイプ変換を行わない限り、T&タイプの参照を初期化するために使用できません.
    「const」キーワードの使用方法:
  • 定数
  • を定義する
    const int MAX_VAL = 23 ; const string SCHOOL_NAME = "Peking University";
  • 定数ポインタ
  • を定義する.
    1定数ポインタでその指向する内容int n,mを修正してはならない.const int * p = & n; * p = 5;//コンパイルエラーn=4;//ok p = &m;//OK,定数ポインタの指向が変化する
    2定数ポインタを非常量ポインタに割り当てることはできません.逆にconst int*p 1ができます.int * p2; p1 = p2;//ok p2 = p1;//error p2 = (int * ) p1;//OK,強制タイプ変換
    3関数パラメータが定数ポインタの場合、関数内部でパラメータポインタが指す場所の内容を誤って変更することを避けることができますvoid MyPrintf(const char*p){strcpy(p,“this”);//コンパイルエラーprintf("%s",p);//ok}
  • 定義常引用
  • 常参照によってその参照の変数int nを変更することはできない.const int & r = n; r = 5;//error n = 4;//ok
    動的メモリ割り当て:
  • new演算子による動的メモリ割り当て
  • 第1の使用法で、変数を割り当てます:
  • P = new T; Tは任意のタイプ名、PはタイプT*のポインタです.sizeof(T)バイトサイズのメモリ領域を動的に割り当て、そのメモリ領域の開始アドレスをPに割り当てる.例えば、int*pn;pn = new int; * pn = 5;
  • 第2の使い方で、配列を割り当てます:
  • P = new T[N]; T:任意のタイプ名P:タイプT*のポインタN:割り当てる配列要素の個数は、整数式でsizeof(T)*Nバイトサイズのメモリ空間を動的に割り当て、そのメモリ空間の開始アドレスをPに割り当てることができる.
    動的割当て配列の例:
    int * pn;
    int i = 5;
    pn = new int[i * 20];
    pn[0] = 20;
    pn[100] = 30; //     。         
  • delete演算子で動的に割り当てられたメモリ
  • を解放する
    「new」で動的に割り当てられたメモリ領域は、delete演算子でdeleteポインタを解放する必要があります.//このポインタはnewから出る空間int*p=new intを指す必要があります.*p = 5; delete p; delete p;//異常を起こし、1つの空間をdeleteに複数回使用できない
    動的に割り当てられた配列をdeleteで解放し、[]delete[]ポインタを追加します.//このポインタはnewから出た配列int*p=new intを指さなければならない[20].p[0] = 1; delete [ ] p;
    インライン関数、関数リロード、関数デフォルトパラメータ:
  • インライン関数:
  • 関数呼び出しには時間オーバーヘッドがあります.関数自体にいくつかの文しかない場合、実行が非常に速く、関数が何度も繰り返し実行される場合、関数を呼び出すことによるこのオーバーヘッドは大きくなります.
  • は、関数呼び出しのオーバーヘッドを低減するために、インライン関数メカニズムを導入した.コンパイラは、インライン関数の呼び出し文を処理するときに、関数を呼び出す文を生成することなく、関数全体のコードを呼び出し文に挿入します.
  • inline int Max(int a,int b)
    {
    if( a > b) return a;
    return b; 
    }

    関数の再ロード:
    1つ以上の関数は、名前は同じですが、パラメータの個数やパラメータのタイプが異なり、関数のリロードと呼ばれます.
    次の3つの関数は、リロード関係です.
    int Max(double f1,double f2) { }
    int Max(int n1,int n2) { }
    int Max(int n1,int n2,int n3) { }
    関数の再ロードにより、関数の名前が簡単になります.
    コンパイラは、呼び出し文の実パラメータの個数とタイプに基づいて、どの関数を呼び出すべきかを判断します.
    (1) int Max(double f1,double f2) { }
    (2) int Max(int n1,int n2) { }
    (3) int Max(int n1,int n2,int n3) { }
    Max(3.4,2.5);//呼び出し(1)
    Max(2,4);//呼び出し(2)
    Max(1,2,3);//呼び出し(3)
    Max(3,2.4);//error,
  • 関数のデフォルトパラメータ:
  • C++では、関数を定義するときに右端の連続するいくつかのパラメータにデフォルト値を持たせることができますが、関数を呼び出すときに、対応する位置にパラメータを書かないと、パラメータがデフォルト値になります.void func( int x1, int x2 = 2, int x3 = 3) { } func(10 ) ;//func(10,2,3)func(10,8);//func(10,8,3)func(10,8)に等しい.//いいえ、
    関数パラメータのデフォルトの目的は、プログラムの拡張性を向上させることです.
    すなわち、書き上げた関数が新しいパラメータを追加し、元の関数を呼び出した文が必ずしも新しいパラメータを使用する必要がない場合は、元の関数呼び出し文の変更を避けるためにデフォルトのパラメータを使用することができます.