📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

Wiki がページ「様々なコンストラクタ(C++)」を「C++の基礎 - コンストラクタ」に、リダイレクトを残さずに移動しました
編集の要約なし
 
(同じ利用者による、間の1版が非表示)
9行目: 9行目:
デフォルトコピーコンストラクタは、自分と同じクラスのインスタンスを引数とするコンストラクタで、<br>
デフォルトコピーコンストラクタは、自分と同じクラスのインスタンスを引数とするコンストラクタで、<br>
メンバ変数をすべてコピーしたものが新しく生成される。<br>
メンバ変数をすべてコピーしたものが新しく生成される。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
  #include <string>
  #include <string>
48行目: 48行目:
     std::cin.get();
     std::cin.get();
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


59行目: 59行目:
clsMyClass2を通してm_piNumberの値を変更すると、無関係のclsMyClass1にも影響が出てしまう。<br>
clsMyClass2を通してm_piNumberの値を変更すると、無関係のclsMyClass1にも影響が出てしまう。<br>
このような場合には、デフォルトコピーコンストラクタを使用してはいけない。<br>
このような場合には、デフォルトコピーコンストラクタを使用してはいけない。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include <iostream>
  #include <iostream>
   
   
92行目: 92行目:
     std::cin.get();
     std::cin.get();
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


101行目: 101行目:
コピーコンストラクタで、コピーしたいメンバ変数を任意に選択することができる。<br>
コピーコンストラクタで、コピーしたいメンバ変数を任意に選択することができる。<br>
ただし、このままだとメンバ変数が勝手にコピーされないだけで、デフォルトコピーコンストラクタを呼び出すことができる。<br>
ただし、このままだとメンバ変数が勝手にコピーされないだけで、デフォルトコピーコンストラクタを呼び出すことができる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  class CMyClass
  class CMyClass
  {
  {
131行目: 131行目:
     *clsMyClass2.get() = 20;
     *clsMyClass2.get() = 20;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


140行目: 140行目:
<br>
<br>
なお、この方法で禁止できるのはコピーコンストラクタの使用であり、代入操作は禁止されない。<br>
なお、この方法で禁止できるのはコピーコンストラクタの使用であり、代入操作は禁止されない。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  class CMyClass
  class CMyClass
  {
  {
165行目: 165行目:
     CMyClass clsMyClass3 = clsMyClass1;
     CMyClass clsMyClass3 = clsMyClass1;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


176行目: 176行目:
変換コンストラクタは、与えられた値の暗黙的な変換が可能な場合、値からインスタンスを生成する。<br>
変換コンストラクタは、与えられた値の暗黙的な変換が可能な場合、値からインスタンスを生成する。<br>
変換ができない場合は、インスタンスを生成することは出来ない。<br>
変換ができない場合は、インスタンスを生成することは出来ない。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  class CMyClass
  class CMyClass
  {
  {
215行目: 215行目:
     std::cin.get();
     std::cin.get();
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


225行目: 225行目:
これは、引数に指定した整数が関数funcに渡された時点で、CMyClassの変換コンストラクタが動作して、<br>
これは、引数に指定した整数が関数funcに渡された時点で、CMyClassの変換コンストラクタが動作して、<br>
CMyClassのインスタンスが生成されるためである。<br>
CMyClassのインスタンスが生成されるためである。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  class CMyClass
  class CMyClass
  {
  {
245行目: 245行目:
     func(10);
     func(10);
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
この動作を意図していない場合が多い。<br>
この動作を意図していない場合が多い。<br>
252行目: 252行目:
コンストラクタの前にexplicitキーワードを付けると、暗黙的な呼び出しを禁止することが出来る。<br>
コンストラクタの前にexplicitキーワードを付けると、暗黙的な呼び出しを禁止することが出来る。<br>
変換コンストラクタは意図しない動作となることが多いので、基本的に禁止しておいた方がよい。<br>
変換コンストラクタは意図しない動作となることが多いので、基本的に禁止しておいた方がよい。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  class CMyClass
  class CMyClass
  {
  {
277行目: 277行目:
     func(clsMyClass);
     func(clsMyClass);
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C++]]
[[カテゴリ:C++]]