【C++】コンストラクタ、解析関数、コピーコンストラクタ

2876 ワード

コンストラクタ
コンセプト:メンバー変数はプライベートで、共通関数で初期化する必要があります.また、この関数は、オブジェクトを定義するときにのみ自動的に実行されます.
特徴:
  • 関数名とクラス名は同じ
  • 戻り値なし
  • オブジェクト構造(オブジェクトインスタンス化)では、対応するコンストラクション関数が自動的に呼び出されます.
  • 構造関数は、
  • を再ロードすることができる.
  • コンストラクション関数は、クラスで定義してもよいし、クラス外で定義してもよいし、クラス外で定義するにはクラスドメインを指定する必要がある.
  • クラスにコンストラクション関数が指定されていない場合、C++コンパイラはデフォルトのコンストラクション関数を自動的に生成します.しかし、デフォルトのコンストラクション関数を自分で定義すれば、コンパイラは生成されません.
  • パラメータのないコンストラクション関数と全デフォルトのコンストラクション関数は、デフォルトのコンストラクション関数とみなされ、デフォルトのコンストラクション関数は1つしかありません.
  • class date{
    public:
    	//       
    	date();
    	//      
    	date(int year, int month, int day){
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	//         
    	date(int year = 2000, int month = 1, int day = 1){
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	//          
    	date(int year, int month = 1, int day = 1){
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	void DisPlay(){
    		cout << _year << "-" << _month << "-" << _day << endl;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    int main(){
    	date d1;
    	d1.DisPlay();
    	date d2(2018, 7, 3);
    	d2.DisPlay();
    	// date d3();    ,        
    	system("pause");
    	return 0;
    }

    コピーコンストラクタ
    コンセプト:オブジェクトを作成するときに同類のオブジェクトを使用して初期化し、コピーコンストラクション関数は特殊なコンストラクション関数です.
    特徴:
  • コピーコンストラクション関数は、実際にはコンストラクション関数のリロードです.
  • コピーコンストラクタでは、参照パラメータを使用する必要があります.値を使用すると、無限の再帰が発生します.
  • 定義されていない場合、システムはデフォルトのコピーコンストラクタをデフォルト化し、デフォルトのコピーコンストラクタはクラスメンバーを順次コピーして初期化します.
  • class date{
    public:
    	date(const date& d){
    		_year = d._year;
    		_month = d._month;
    		_day = d._day;
    	}
    	void DisPlay(){
    		cout << _year << "-" << _month << "-" << _day << endl;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    int main(){
    	date d1;
    	date d2(d1);
    	date d3 = d2;
    	system("pause");
    	return 0;
    }

    こうぞうかんすう
    概念:オブジェクトのライフサイクルが終了すると、C++コンパイルシステムは自動的にメンバー関数を呼び出します.この特殊なメンバー関数、すなわち構造関数です.
    特徴:
  • 解析関数クラス名に~
  • を加算
  • 解析関数パラメータなし戻り値なし
  • クラスに1つの構造関数があり、定義されていない場合、デフォルトの構造関数
  • が自動的に生成されます.
  • オブジェクトのライフサイクルが終了すると、構造関数
  • が自動的に呼び出されます.
  • 構造関数は、オブジェクトを削除するのではなく、クリーンアップ作業を行います.このクリーンアップ作業は、一部のメンバーが動的に解放される必要があると理解できます.
  • で呼び出された構造関数をクリーンアップします.
  • class Array{
    public:
    	Array(int size){
    		_ptr = (int*)malloc(size*sizeof(int));
    	}
    	~Array(){
    		if (_ptr){
    			free(_ptr);
    			_ptr = 0;
    		}
    	}
    private:
    	int* _ptr;
    };
    int main(){
    	Array arr(2);
    	system("pause");
    	return 0;
    }

    質問:システムはデフォルトの構造関数を自動的に生成します.なぜ私たちは自分で構造関数を書くのですか.
    上の呼び出しコードがこのように変更されたら
    int main(){
    	Array arr1(2);
    	Array arr2(arr1);
    	system("pause");
    	return 0;
    }

    arr 1とarr 2は同じアドレス空間を指し,システムのデフォルトで生成された解析関数を用いてarr 2が解析されるとarr 1が解析されると問題が発生する.私たちは一般的に自分で構造関数を書く必要があるからです.