コピーコンストラクタ

1370 ワード

コピーコンストラクタ
では、オブジェクトを作成するときに、オブジェクトと同じ新しいオブジェクトを作成できますか?
コンストラクション関数:既存のクラスタイプオブジェクトで新しいオブジェクトを作成するときにコンパイラによって自動的に呼び出される、クラスタイプオブジェクトへの参照である単一のパラメータのみ.
1.特徴
コピーコンストラクション関数も特殊なメンバー関数で、次のような特徴があります.
  • コピーコンストラクタはコンストラクタのリロード形式
  • である.
  • コピーコンストラクション関数のパラメータは1つのみであり、参照パラメータを使用する必要があります.値伝達方式を使用すると、無限再帰呼び出し
  • が発生します.
    class Date
    {
    public:
    	Date(int year = 1990, int month = 1, int day = 1)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	Date(const Date& d)
    	{
    		_year = d._year;
    		_month = d._month;
    		_day = d._day;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    int main()
    {
    	Date d1;
    	Date d2(d1);
    
    	return 0;
    }
    
  • 未定義が表示されると、システムはデフォルトのコピーコンストラクタを生成します.デフォルトのコピーコンストラクタオブジェクトは、メモリストレージによってバイト順にコピーされます.このコピーは、浅いコピー、または値コピーと呼ばれます.
  • では、コンパイラが生成したデフォルトのコピー構造関数とバイト順の値コピーを完了することができますが、私たちは自分で実現する必要がありますか?検証してみましょう.
  • //               ?                 。 
    class String 
    { 
    public:
        String(const char* str = "jack")   
         {
                 _str = (char*)malloc(strlen(str) + 1);
                         strcpy(_str, str);    
           }
     
        ~String()    
        {
                cout << "~String()" << endl;
                free(_str);    
        } 
        private:
            char* _str; 
     };
     
    int main()
    { 
       String s1("hello");    
       String s2(s1);
    }