c++:(各種)構造関数の呼び出し方式

5969 ワード

c++のクラスには、5つの注意すべき基本的な関数があります.
  • 無パラメトリック構造関数
  • パラメトリック構造関数
  • コピーコンストラクタ
  • 賦値関数
  • 解析関数
  • 構造関数については、前のブログでc+:が自動的にdeleteされるかどうか注意してください.言及しましたが、ここではしばらくは言いません.このブログでは主にこの3つのコンストラクション関数、1つの付与関数の呼び出し方式を記録していますが、学習した後、どのように呼び出すかを知るだけでなく、一言でコンストラクション関数を何回呼び出したのかを判断してほしいと思います.
    たとえば、現在Animalクラスがある場合、デバッグのために各コンストラクション関数に出力文を追加して、呼び出しの結果を見てみましょう.
    struct Animal {
        int age;
        string name;
    
        Animal() {  //       
            cout << "No-args Constructor" << endl;
            age = -1;
            name = "Unknown";
        }
    
        Animal(string name, int age) { //       
            cout << "Argumenting Constructor" << endl;
            this->name = name;
            this->age = age;
        }
    
        Animal(const Animal &other) { //       
            cout << "Copy constructor" << endl;
            this->name = other.name;
            this->age = other.age;
        }
    
        Animal& operator=(const Animal &other) { //     
            cout << "Assigning" << endl;
            this->name = other.name;
            this->age = other.age;
        }
    
        ~Animal() {
            cout << "Destructor" << endl;
        }
    
        friend ostream& operator<const Animal &animal) {
            out << "Animal[" << animal.name << "]: " << "age=" << animal.age;
            return out;
        }
    };

    次に、次のコードでは、インスタンスを作成する方法を説明し、各作成方法の出力結果と、注釈でいくつかの思考を書きます.
    int main() {
    
    
        //-----------------      -----------------------
    
        Animal animal01; //        ,          ,        ,                。
        cout << animal01 << endl;
        /*
            :
            No-args Constructor
            Animal[Unknown]: age=-1
        */
    
    
        Animal animal02(); //             !              ,       1        (      )。
        cout << animal02 << endl;
        /*
            :
            1
        */
    
    
        Animal animal03 = Animal();
        //   ,         :             ,                       ,                 。
        //    ,        ,         ,                     。  “Animal animal03;”    。
        cout << animal03 << endl;
        /*
            :
            No-args Constructor
            Animal[Unknown]: age=-1
        */
    
        //----------------------------------------------
    
    
    
    
        //-----------------      -----------------------  
    
        Animal animal001("Lion", 1);
        cout << animal001 << endl;
        /*
            :
            Argumenting Constructor
            Animal[Lion]: age=1
        */
    
    
        Animal animal002 = Animal("Lion", 1);
        //         ,                。
        cout << animal002 << endl;
        /*
            :
            Argumenting Constructor
            Animal[Lion]: age=1
        */
    
        //----------------------------------------------
    
    
    
    
        //----------------      -------------------  
    
        Animal animal0001 = animal001;
        //      “      ” “    ”     。            ,    。            。
        cout << animal0001 << endl;
        /*
            :
            Copy constructor
            Animal[Lion]: age=1
        */  
    
        //-------------------------------------------
    
    
    
    
        //------------------    ------------------------  
    
        Animal animal;
        animal = animal0001;
        //     animal           ,              ,         。
        cout << animal << endl;
        /*
            :
            No-args Constructor
            Assigning
            Animal[Lion]: age=1
        */  
    
        //-----------------------------------
    
        return 0;
    }