[熱血C+]Chapter 5


C++スタイルの初期化

int num(20); // int num=20; 으로 작성해도 묵시적 변환이 이루어진다

エラーコピー作成者

SimpleClass(const SimpleClass &copy) : num1(copy.num1), num2(copy.num2) { }

explicit


このキーワードを使用すると、代入演算子を使用してジェネレータを呼び出すことはできません(暗黙的な変換をブロックします).
explicit SimpleClass(const SimpleClass &copy) : num1(copy.num1), num2(copy.num2) { }
// SimpleClass sim1(10,20);
// SimpleClass sim2=sim1; (X)
// SimpleClass sim2(sim1); (O)

Shallow Copy & Deep Copy



この場合、メンバー間でBag 1にコピーすると、同じアドレスへの2つのポインタ(Shallow Copy)が生成されます.

ここでBag 1のポインタに対してdeleteを呼び出すと、Bag 2は有効な値を持たない

これを防ぐために,ポインタ参照にコピーしたターゲットをDeep Copyと呼ぶ.
// Deep Copy 코드 예시
 Person(const Person& copy)
 {
 	name = new char[strlen(copy.name)+1];
    strcpy(name, copy.name);
 }

レプリケーションジェネレータを呼び出すタイミング


メモリ割り当てと同時に初期化を行います。

  • 既存作成オブジェクトを使用して新しいオブジェクトを初期化する場合:
  • が値によって関数を呼び出す過程で、オブジェクトをパラメータとして渡す:
  • オブジェクト(参照フォントxを返す)
  • を返すと

    クラスの外部からオブジェクトにアクセスするために必要な

  • オブジェクトの名前
  • オブジェクトの参照値
  • オブジェクトのアドレス値
  • 一時オブジェクト

  • オブジェクトが生成された後、変数として受信されない場合、一時オブジェクトの参照値が返されます.
    したがって、
    const Temporary &ref = Temporary(300);
  • という情報が得られます.
  • の場合、temprefという新しいオブジェクトを作成するのではなく、返される一時オブジェクトに名前を割り当てます.
    class SoSimple { .... };
    
    SoSimple SimpleFuncObj(SoSimple ob)
    {
    	cout<< "Parameter ob 생성" << endl;
    	return ob;
    }
    
    int main(void)
    {
    	SoSimple obj;
        So Simple tempRef = SimpleFuncObj(obj); // 생성자 호출 (x)
        return 0;
    }