C++言語-02-関数

4008 ワード

一般関数
C++  C                  , C     
  • C++の一般関数はC言語の一般関数と類似の性質を有する.以下のブログを参照してください:C言語-04-関数
  • クラスに関連する関数
    C   OOP  ,  OOP     ,C++           。
  • 構造関数とコピー構造関数
  • コンストラクタ
  • は、クラスを使用してオブジェクトを作成するときに実行される特殊なメンバー関数で、通常、オブジェクトを作成するときに特定のメンバー変数の初期値を設定するために使用されます.
  • 構造関数の定義仕様
  • 関数名はクラス名と同じ
  • は、
  • の値を返しません.
  • 構造関数の種類
  • 無パラメトリック構造関数
  • パラメトリック構造関数
  • は、初期化リストを使用してフィールド
  • を初期化することができる.

  • 定義方式
    //        
    ClassName() {
        // body of the function
    }
    //        ,       
    ClassName(MemberVariableType memberVariable) : variable(memberVariable) {
        // body of the function
    }
  • コピーコンストラクタ
  • は、オブジェクトを作成し、同じクラスの前に作成するオブジェクトを使用して、新しく作成するオブジェクト
  • を初期化する特殊な構造関数です.
  • コピーコンストラクション関数が呼び出されたシーン
  • 新しく作成するオブジェクト
  • を初期化するために別の同じタイプのオブジェクトを使用する.
  • 付与オブジェクトは、パラメータとして関数
  • に渡す.
  • はオブジェクトを割り当て、関数からこのオブジェクト
  • を返す.
  • 注意
  • コピーコンストラクタが定義されていない場合、コンパイラは自動的に1つを定義します.しかし、場合によっては、コピー構造関数を定義する必要があります.
  • クラスにはポインタタイプのメンバー変数があり、動的メモリ割り当て
  • がある.

  • 定義方式
    ClassName(const ClassName &classInstance) {
        variable = classInstance.variable
    }

  • 構造関数
  • は、クラスのイメージが破棄するときに実行される特殊なメンバー関数であり、通常、プログラムから飛び出す前にリソース
  • を解放するために使用される.
  • 構造関数の定義仕様
  • 関数名はクラス名と同じであり、関数名に波号(~)を接頭辞
  • として付ける必要がある.
  • は、パラメータ
  • を持たない値を返さない.
  • 定義方式
    ```
    ~ClassName() {
        // Release the resource of the classInstance
    }
    ```
  • 友元関数
  • クラスの外部に定義され、クラスのプライベートメンバーと保護メンバーにアクセスする権限を持つ関数
  • 定義方式
    //             
    friend returnType functionName();
    //              ,           ::
    returnType functionName() {
        body of the function;
    }
  • 注意
  • 友元関数はメンバー関数ではありません.thisポインタ
  • は使用できません.

  • インライン関数
  • コンパイルフェーズでは、コンパイラは、inlineキーワード定義を使用して、以下の
    inline returnType functionName() {
        // body of the function
    }
  • のように、インライン関数のコードコピーをインライン関数を呼び出す各場所にコピーする.
  • インライン関数の注意事項
  • クラス定義で定義された関数は、inlineキーワード
  • が使用されていなくても、デフォルトでは2つの関数です.
  • インライン関数を変更するたびに、その関数のすべての呼び出しコード(置換関数呼び出しの古いインライン関数のコピー)
  • を再コンパイルする必要があります.

  • 定義Animalクラス
    class Animal {
    private:
        string name; //   
        int *age; //   
    public:
        // set  
        inline void setName(string animalName) {
            name = animalName;
        }
        void setAge(int animalAge) {
            *age = animalAge;
        }
        //        
        Animal() {
            cout << "Normal constructor" << endl;
            //          
            age = new int;
        }
        //        
        Animal(string animalName, int animalAge) {
            cout << "Normal constructor with parameter" << endl;
            name = animalName;
            //          
            age = new int;
            *age = animalAge;
        }
        //       
        Animal(const Animal &animal) {
            cout << "Copy constructor" << endl;
            name = animal.name;
            //          
            age = new int;
            *age = *animal.age;
        }
        //     
        friend void printAnimal(const Animal animal);
        //     
        ~Animal() {
            cout << "Release the resource of the classInstance" << endl;
            delete age;
        }
    };
  • Animalクラスのメタ関数
    //        
    void printAnimal(const Animal animal) {
       cout << "    :" << animal.name << "   :" << *animal.age << endl;
    }
  • を定義する
  • main()関数
    int main(int argc, const char * argv[]) {
        //            Animal  
        Animal dog1;
        dog1.setName("TOBY");
        dog1.setAge(5);
        //         dog1
        printAnimal(dog1);
        //            Animal  
        Animal dog2("MAX", 4);
        //         dog2
        printAnimal(dog2);
        //           Animal  
        Animal dog3 = dog2;
        printAnimal(dog3);
        return 0;
    }