C++コピーコンストラクタのいくつかの詳細
4232 ワード
コピーコンストラクション関数はc++の最も基礎的な概念の一つであり、コピーコンストラクション関数について知っていると思いますか?では、まず三つの質問に答えてください.わかりました.
1、次の関数はどれがコピーコンストラクション関数ですか.なぜですか.
2、一つのクラスにもう一つのコピーコンストラクタが存在してもいいですか?
3、プログラムセグメントの出力結果を書いて、なぜか説明します.君の答えが正しいと言ったら、早くここを出なさい.ここはあなたの生息地ではありません!
答え:
1.クラスXの場合、コンストラクション関数の最初のパラメータが次のいずれかである場合.
a)X&
b)const X&
c)volatile X&
d)const volatile X&
他のパラメータや他のパラメータがデフォルト値を持っていない場合、この関数はコピーコンストラクション関数です.
2.クラスにコピーコンストラクタが1つ以上存在してもよい
クラスにパラメータX&のコピーコンストラクタが1つしかない場合、const Xまたはvolatile Xのオブジェクトは使用できません.(volatileタイプはどんなタイプですか...自分で調べます)
クラスにコピーコンストラクタが定義されていない場合、コンパイラはデフォルトのコピーコンストラクタを自動的に生成します.このデフォルトのパラメータは、X::X(const X&)またはX::X(X&)であり、コンパイラがコンテキストに基づいてどちらを選択するかを決定します.
デフォルトのコピーコンストラクタの動作は次のとおりです.
デフォルトのコピーコンストラクション関数は、他のユーザーが定義したコンストラクション関数と同じ順序で、親クラスと子クラスのコンストラクションを実行します.
a>データ・メンバーがクラスのインスタンスである場合、このようなコピーコンストラクタが呼び出されます.
b>データ・メンバーが配列である場合、配列の各々にビット・コピーを実行します.
c>int,doubleなどのデータメンバーが1つの数である場合、システム内奸のレプリケーション演算子を呼び出して割り当てます.
3、コピーコンストラクション関数はメンバー関数テンプレートから生成できません.
理由は簡単です.メンバー関数テンプレートは変更されません.言語のルールは、プログラムがコピー構造関数を必要とし、宣言していない場合、
コンパイラは自動的に1つを生成するので、メンバー関数テンプレートはコンパイラがコピー構造関数を生成することを阻止しません.付与演算子の再ロードも同じルールに従います.
1、次の関数はどれがコピーコンストラクション関数ですか.なぜですか.
1 X::X(const X&);
2 X::X(X);
3 X::X(X &,int a=1);
4 X::X(X &,int a=1,b=2);
2、一つのクラスにもう一つのコピーコンストラクタが存在してもいいですか?
3、プログラムセグメントの出力結果を書いて、なぜか説明します.君の答えが正しいと言ったら、早くここを出なさい.ここはあなたの生息地ではありません!
答え:
1.クラスXの場合、コンストラクション関数の最初のパラメータが次のいずれかである場合.
a)X&
b)const X&
c)volatile X&
d)const volatile X&
他のパラメータや他のパラメータがデフォルト値を持っていない場合、この関数はコピーコンストラクション関数です.
1 X::X(const X&)//
2 X::X(X&,int a=1)//
2.クラスにコピーコンストラクタが1つ以上存在してもよい
1 class X
2 {
3 public:
4 X(const X&);
5 X(X&);
6 };
クラスにパラメータX&のコピーコンストラクタが1つしかない場合、const Xまたはvolatile Xのオブジェクトは使用できません.(volatileタイプはどんなタイプですか...自分で調べます)
クラスにコピーコンストラクタが定義されていない場合、コンパイラはデフォルトのコピーコンストラクタを自動的に生成します.このデフォルトのパラメータは、X::X(const X&)またはX::X(X&)であり、コンパイラがコンテキストに基づいてどちらを選択するかを決定します.
デフォルトのコピーコンストラクタの動作は次のとおりです.
デフォルトのコピーコンストラクション関数は、他のユーザーが定義したコンストラクション関数と同じ順序で、親クラスと子クラスのコンストラクションを実行します.
a>データ・メンバーがクラスのインスタンスである場合、このようなコピーコンストラクタが呼び出されます.
b>データ・メンバーが配列である場合、配列の各々にビット・コピーを実行します.
c>int,doubleなどのデータメンバーが1つの数である場合、システム内奸のレプリケーション演算子を呼び出して割り当てます.
3、コピーコンストラクション関数はメンバー関数テンプレートから生成できません.
1 struct X{
2 template<typename T>
3 X(T&)
4 {
5 cout <<"This is ctor"<<endl;
6 }
7 template<typename T>
8 X& operator=(T& )
9 {
10 cout <<"This is ctor."<<endl;
11 }
12
13 };
理由は簡単です.メンバー関数テンプレートは変更されません.言語のルールは、プログラムがコピー構造関数を必要とし、宣言していない場合、
コンパイラは自動的に1つを生成するので、メンバー関数テンプレートはコンパイラがコピー構造関数を生成することを阻止しません.付与演算子の再ロードも同じルールに従います.