最終更新:2021-01-07 (木) 19:33:44 (1204d)  

C++/コピー
Top / C++ / コピー

値渡し

  • int, float, bool, char等
  • コピーが行われる
    int func(int a){}
    int x = 0;
    func(x);

ポインタ渡し

  • int func(int* a){}
    int x = 0;
    func(&x);
  • ポインタ渡しを行う際は必ず null チェックを行うべき

参照渡し

  • C言語には無く、C++で新たに追加された記法
    int func(int& a){}
    int x = 0;
    func(x);
  • ポインタとの違いは, 無効値を表す記法が存在しない事
    • 呼び出される関数側ではその参照が有効な参照である事を前提条件として内容を記述出来る
    • 呼び出す側では無効な参照を渡さない事を前提にプログラムを記述する事を必然的に文法レベルで要求される
  • C++/参照

デフォルトの仕様

  • 各メンバーに対して、コピーコンストラクターあるいは代入演算子を順に呼び出す
  • オブジェクトをそのままコピーすると同じ領域への参照が発生して整合性が保てなくなる
  • stringのクラス自体は内部に動的に割り当てるメモリーを持っているが、stringコピーコンストラクタ代入演算子?を持っていてそれを呼び出すため問題なく処理される

  • class A {}
    
    int main() {
        A a1, a3;  // (1)コンストラクタの実行
        A a2 = a1; // (2)コピーコンストラクタの実行
        a3 = a1;   // (3)代入演算子の実行
    }

コピーコンストラクタ

  • クラスのインスタンスを複製する際に呼び出される
  • メモリーを動的に割り当てるクラスで定義が必要
  • 最初(初期化時)にコピーするのがコピーコンストラクタ

代入演算子

  • 途中でコピー

参考