📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 Wiki がページ「様々なコンストラクタ(C++)」を「C++の基礎 - コンストラクタ」に、リダイレクトを残さずに移動しました |
編集の要約なし |
||
| (同じ利用者による、間の1版が非表示) | |||
| 9行目: | 9行目: | ||
デフォルトコピーコンストラクタは、自分と同じクラスのインスタンスを引数とするコンストラクタで、<br> | デフォルトコピーコンストラクタは、自分と同じクラスのインスタンスを引数とするコンストラクタで、<br> | ||
メンバ変数をすべてコピーしたものが新しく生成される。<br> | メンバ変数をすべてコピーしたものが新しく生成される。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
#include <string> | #include <string> | ||
| 48行目: | 48行目: | ||
std::cin.get(); | std::cin.get(); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 59行目: | 59行目: | ||
clsMyClass2を通してm_piNumberの値を変更すると、無関係のclsMyClass1にも影響が出てしまう。<br> | clsMyClass2を通してm_piNumberの値を変更すると、無関係のclsMyClass1にも影響が出てしまう。<br> | ||
このような場合には、デフォルトコピーコンストラクタを使用してはいけない。<br> | このような場合には、デフォルトコピーコンストラクタを使用してはいけない。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <iostream> | #include <iostream> | ||
| 92行目: | 92行目: | ||
std::cin.get(); | std::cin.get(); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 101行目: | 101行目: | ||
コピーコンストラクタで、コピーしたいメンバ変数を任意に選択することができる。<br> | コピーコンストラクタで、コピーしたいメンバ変数を任意に選択することができる。<br> | ||
ただし、このままだとメンバ変数が勝手にコピーされないだけで、デフォルトコピーコンストラクタを呼び出すことができる。<br> | ただし、このままだとメンバ変数が勝手にコピーされないだけで、デフォルトコピーコンストラクタを呼び出すことができる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
class CMyClass | class CMyClass | ||
{ | { | ||
| 131行目: | 131行目: | ||
*clsMyClass2.get() = 20; | *clsMyClass2.get() = 20; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 140行目: | 140行目: | ||
<br> | <br> | ||
なお、この方法で禁止できるのはコピーコンストラクタの使用であり、代入操作は禁止されない。<br> | なお、この方法で禁止できるのはコピーコンストラクタの使用であり、代入操作は禁止されない。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
class CMyClass | class CMyClass | ||
{ | { | ||
| 165行目: | 165行目: | ||
CMyClass clsMyClass3 = clsMyClass1; | CMyClass clsMyClass3 = clsMyClass1; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 176行目: | 176行目: | ||
変換コンストラクタは、与えられた値の暗黙的な変換が可能な場合、値からインスタンスを生成する。<br> | 変換コンストラクタは、与えられた値の暗黙的な変換が可能な場合、値からインスタンスを生成する。<br> | ||
変換ができない場合は、インスタンスを生成することは出来ない。<br> | 変換ができない場合は、インスタンスを生成することは出来ない。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
class CMyClass | class CMyClass | ||
{ | { | ||
| 215行目: | 215行目: | ||
std::cin.get(); | std::cin.get(); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 225行目: | 225行目: | ||
これは、引数に指定した整数が関数funcに渡された時点で、CMyClassの変換コンストラクタが動作して、<br> | これは、引数に指定した整数が関数funcに渡された時点で、CMyClassの変換コンストラクタが動作して、<br> | ||
CMyClassのインスタンスが生成されるためである。<br> | CMyClassのインスタンスが生成されるためである。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
class CMyClass | class CMyClass | ||
{ | { | ||
| 245行目: | 245行目: | ||
func(10); | func(10); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
この動作を意図していない場合が多い。<br> | この動作を意図していない場合が多い。<br> | ||
| 252行目: | 252行目: | ||
コンストラクタの前にexplicitキーワードを付けると、暗黙的な呼び出しを禁止することが出来る。<br> | コンストラクタの前にexplicitキーワードを付けると、暗黙的な呼び出しを禁止することが出来る。<br> | ||
変換コンストラクタは意図しない動作となることが多いので、基本的に禁止しておいた方がよい。<br> | 変換コンストラクタは意図しない動作となることが多いので、基本的に禁止しておいた方がよい。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
class CMyClass | class CMyClass | ||
{ | { | ||
| 277行目: | 277行目: | ||
func(clsMyClass); | func(clsMyClass); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C++]] | [[カテゴリ:C++]] | ||