C++プログラミング言語読書ノート-C 7-関数

2970 ワード

1.関数の定義、すなわち、関数体が与えられた関数宣言
2.inline記述子は関数の意味に影響しない
3.ローカル変数がstaticとして宣言されると、関数のすべての呼び出しでこの変数を表すために使用される静的に割り当てられたオブジェクトは1つしかありません.このオブジェクトは、スレッドが定義に最初に到達したときにのみ初期化されます.
4.ポインタパラメータをconstとして宣言する、すなわち、関数がこのパラメータによって指すオブジェクトを変更しないことを読者に知らせる
5.文字量、定数、変換するパラメータはconst&パラメータに渡すことができますが、const以外の参照パラメータには渡すことはできません.
6.配列は他のタイプとは異なり、配列は値で伝達されません.呼び出された関数では、配列パラメータのサイズは利用できません.
7.異なるタイプで動作する関数に同じ名前を使用する場合は、リロードとなります.1つの関数fが呼び出されると、コンパイラは、名前fを有するどの関数を呼び出すべきかを明らかにしなければならない.この作業を完了するには、実際のパラメータのタイプとfという名前のすべての関数の形式パラメータのタイプを比較する必要があります.基本的な考え方は、パラメータ上で最もよく一致する関数を呼び出し、一致する最も良い関数が存在しない場合、コンパイルエラーを与えることです.
8.最も合理的な考え方にできるだけ近づけるためには、次の一連のマッチング基準を順番にチェックする必要があります.正確なマッチング->向上したマッチングの利用->標準変換の利用->ユーザ定義変換の利用->関数宣言の省略記号の利用
9.リロード解析では戻りタイプは考慮されません
10.異なる名前以外の空間の役割ドメインで宣言された関数はリロードではありません.
11.役割ドメインまたは名前空間にまたがる役割ドメインをリロードする場合は、「使用宣言」または「使用命令」を使用します.
12.一部のc++初心者は、コンパイラが報告した曖昧なエラーにイライラします.より経験のあるプログラマーは、このようなエラー情報を鑑賞し、設計エラーに関する有用なインジケータと見なしています.
13.デフォルトのパラメータのタイプは、関数宣言時にチェックされ、呼び出し時に評価されます.同じ役割ドメインの後続の宣言では、デフォルトのパラメータは繰り返したり変更したりできません.
14.この関数を宣言する方法は、パラメータテーブルの最後に省略記号を使用して終了し、省略記号には「他のパラメータもある可能性があります」と表示されます.このような関数は、コンパイル時に使用できない情報領域に依存してパラメータテーブルを解釈する必要があります.
15.整数0を終端として使用すると、移植不可能な問題が生じる可能性がある.いくつかのインプリメンテーションでは、整数0と空のポインタの表現形式が異なる場合がある.
16.1つの使用済みva_からstart()の関数で終了する前に、va_を呼び出す必要があります.end().これはva_start()はスタックを何らかの方法で変更した可能性があります.この変更は戻りが完了しない可能性があります.va_end()は関連する修正を復元することができる.
17.1つの関数について2つのことしかできません.呼び出したり、アドレスを取得したりします.
練習問題:9、10、15
 
9.
void SimpleEncrypt() {
    string key; 

    cout << "Please input keys used to encrypt: " << endl;

    getline(cin, key);

    if (key.size() == 0) {
        cout << "Key is empty, the input string will not be encrypted!" << endl;
    }

    cout << "Please input string to be encrypted: " << endl;

    string str, str_encrypted, str_decrypted; 
    getline(cin, str);

    if (key.size() > 0) {
        int keyIndex = 0; 
        for (int i=0; i<str.size(); i++) {
            str_encrypted.push_back(str[i] ^ key[keyIndex]);
            keyIndex = (++keyIndex) % key.size();
        }
    }
    else {
        str_encrypted = str;
    }

    if (key.size() > 0) {
        int keyIndex = 0;
        for (int i=0; i<str_encrypted.size(); i++) {
            str_decrypted.push_back(str_encrypted[i] ^ key[keyIndex]);
            keyIndex = (++keyIndex) % key.size();
        }
    }
    else {
        str_decrypted = str_encrypted;
    }
    
    cout << "Encrypted key: " << str_encrypted << endl;
    cout << "Decrypted key: " << str_decrypted << endl;
};