C++ダミー構造関数
2790 ワード
C++ダミー構造関数
タイプがダミー構造関数を必要とするもう1つの特徴は、ポインタメンバーまたは参照メンバーを持つことです.ポインタ・メンバーと参照メンバーがある場合、このタイプは通常、構造関数およびコピー操作を実装する必要があります.
通常、構造関数を実装するタイプは、コピー構造関数とコピーレプリケーション関数を実装する必要があります.
経験則として:
虚関数機能を持つクラスがある場合は、次の理由で虚構造関数が必要です.
1.クラスに虚関数機能がある場合は、ベースクラスとしてよく使用されます.
2.ベースクラスの場合、派生クラスはnewを使用して割り当てることが多い.
3.派生クラスオブジェクトがnewを使用して割り当てられ、そのベースクラスを指すポインタによって制御される場合、そのベースクラスを指すポインタによって削除されることがよくあります(ベースクラスに虚構造関数がない場合、結果は不確定になり、実際に発生した場合、派生クラスの構造関数は呼び出されません).
ベースクラスにダミー構造関数がある場合,最下層の派生クラスの構造関数が最初に呼び出され,次いで各ベースクラスの構造関数が呼び出される.
保護的な構造関数としての役割はまだ分からない.ここには一つの解釈がある.http://blog.csdn.net/huzzyy/article/details/2562804 .わかりました.後で補充します.
保護として宣言された構造関数について、ネット上では次のような解釈があります.
本文の著作権は作者kanegoとブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.
タイプがダミー構造関数を必要とするもう1つの特徴は、ポインタメンバーまたは参照メンバーを持つことです.ポインタ・メンバーと参照メンバーがある場合、このタイプは通常、構造関数およびコピー操作を実装する必要があります.
通常、構造関数を実装するタイプは、コピー構造関数とコピーレプリケーション関数を実装する必要があります.
経験則として:
虚関数機能を持つクラスがある場合は、次の理由で虚構造関数が必要です.
1.クラスに虚関数機能がある場合は、ベースクラスとしてよく使用されます.
2.ベースクラスの場合、派生クラスはnewを使用して割り当てることが多い.
3.派生クラスオブジェクトがnewを使用して割り当てられ、そのベースクラスを指すポインタによって制御される場合、そのベースクラスを指すポインタによって削除されることがよくあります(ベースクラスに虚構造関数がない場合、結果は不確定になり、実際に発生した場合、派生クラスの構造関数は呼び出されません).
ベースクラスにダミー構造関数がある場合,最下層の派生クラスの構造関数が最初に呼び出され,次いで各ベースクラスの構造関数が呼び出される.
保護的な構造関数としての役割はまだ分からない.ここには一つの解釈がある.http://blog.csdn.net/huzzyy/article/details/2562804 .わかりました.後で補充します.
保護として宣言された構造関数について、ネット上では次のような解釈があります.
1、 , , virtual ,
( ; delete) ,
, 。
virtual , virtual ,
vtable, vptr 。 ,
protected( delete , ),
。
2、 。
, , :
, , , ? , , , , , , ! , protected private, “ ” 。
protected , “ ” 。
private , “ ” 。
, 。
protected private ?
:
1。 ( A) , A , A / protected, A / public。 :
class A
{ protected: A(){}
public: ....
};
calss B : public A
{ public: B(){}
....
};
A a; // error
B b; // ok
2. / private, “ ” 。 “ ” , 。
class A
{
private:
A(){ }
~A(){ }
public:
void Instance()// A
{
A a;
}
};
。 Instance A 。Instance A 。
, Instance 。 ?
Instance , 。 private 。 。
A aObj; //
aObj.Instance();
, Instance static , , 。 :class A
{
private:
A():data(10){ cout << "A" << endl; }
~A(){ cout << "~A" << endl; }
public:
static A& Instance()
{
static A a;
return a;
}
void Print()
{
cout << data << endl;
}
private:
int data;
};
A& ra = A::Instance();
ra.Print();
singleton C++ 。
: operator=( ) private, 。
。
《effective C++》 。 。 。
本文の著作権は作者kanegoとブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置で原文の接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.