C++コンストラクション関数について

1692 ワード

c++のすべての構造関数を先に列挙する
1.デフォルトのコンストラクション関数とパラメータ付きのコンストラクション関数をひとまず「一般コンストラクション関数」と呼ぶ.eg Test(); or Test(int i, ...);
2、コピー構造関数Test(const Test&t);
3、タイプ変換構造関数Test(int i);
一、一般構造関数
1、ここでは、デフォルトのコンストラクション関数のライフサイクルについて説明します.つまり、いつ現れますか.
答え:通常、クラスでは、コンストラクション関数のタイプが指定されていない場合、このデフォルトのコンストラクション関数はコンパイラによって自動的に生成されます.
逆に、プログラマが任意のタイプのコンストラクション関数を与えた場合、コンパイラはデフォルトのコンストラクション関数を生成しません(これはすべてのコンストラクション関数に適用されます).
次の例を見てください.
#include <iostream>

using namespace std;

class Test
{
public:
	Test(int iCounter);
private:
	int m_iCounter;
};

Test :: Test(int iCounter)
{
	m_iCounter = iCounter;
}

int main()
{
	Test test; 	
	return 0;	
}

クラスでは、コンストラクション関数のタイプが与えられているため、コンパイラはデフォルトコンストラクション関数の自動生成を支援しません.main関数では、デフォルトコンストラクション関数を呼び出すことでオブジェクトを作成するのは間違っています.「Test::Test()」の呼び出しに一致しない関数です.
2、変更:
(1)一般構造関数をprivateに入れると、どのような効果が得られますか?
二、コピー構造関数
名前の通り、コピーコンストラクション関数は、既存のオブジェクトを使用してひょうたん画瓢を探してオブジェクトを作成しようとすると、新しいオブジェクトが呼び出すコンストラクション関数です.
1、詳細
(1)コピーコンストラクション関数をプライベートに設定したらどうなりますか.
eg:
class Test
{
public:
	Test();
private:
	Test(const Test & t);
};

main関数では、次のように使用します.
int main()
{
	Test t;
	Test t2 = t;

	return 0;
}

コンパイル、エラー:‘Test::Test(const Test&)’はプライベートです.私たちはクラスの外部で、オブジェクトtでt 2をコピーして構築します.このとき、t 2はコピー構造関数を呼び出しますが、コピー構造関数はプライベートで、クラスの外部で呼び出すのは違法です.
したがって,コピーコンストラクタをプライベートに設定する効果は,クラス外部でオブジェクトのコピーを行うことができないことである.
三、タイプ変換構造関数、
1、詳細:
(1)通常、1つのパラメータのみを持つコンストラクタはタイプ変換コンストラクタであるが、1つのパラメータを持つコンストラクタはタイプ変換コンストラクタでなくてもよく、eg:通常のコンストラクタであってもよく、コピーコンストラクタであっても1つのコンストラクタのみである.