【C++ベース】コンストラクタのコピー、コンストラクタの呼び出し状況

2038 ワード

ps:本を読むときはいつも構造関数をコピーされ、構造関数に悩まされ、すぐに「このとき、○○の場合は複製構造関数(または構造関数)を呼び出す」と、インターネットでいくつかの資料を調べ、関連書籍を調べ、いくつかのまとめをした.
コンストラクション関数とコンストラクション関数の役割をコピーします.
レプリケーションコンストラクタはいつ呼び出されますか?
1.オブジェクトを新規作成して同類の既存オブジェクトに初期化すると、レプリケーションコンストラクション関数が呼び出されます.この場合が多く、最も一般的なのは、新しいオブジェクトを既存のオブジェクトに表示して初期化することです.
2.プログラムがオブジェクトのコピーを生成すると、コンパイラはコピーコンストラクタを使用します.具体的には、関数が値でオブジェクトまたは関数を渡してオブジェクトを返す場合です.
具体的な例は、ブログを参照してください.http://blog.csdn.net/Fredomyan/article/details/6709686
一般的な面接問題について説明します.
class A
{
private:
    int value;
    
public:
    A(int n) { value = n; }
    A( A other ) { value = other.value; }
    
    void Print()  { std::cout << value << std::endl; }
};

int _tmain( int argc, _TCHAR* argv[] )
{
    A a = 10;
    A b = a;
    b.Print();
    return 0;
}

結果は、コンパイルエラーです.レプリケーションコンストラクタA(A other)が入力するパラメータはAの一例であるため、コンストラクタを実パラメータにレプリケーションするとレプリケーションコンストラクタが呼び出されるが、C++の基準ではレプリケーションコンストラクタの値パラメータのレプリケーションは許可されないため、コンパイルエラーが発生する.
解決策:コンストラクション関数をA(const A&other)に変更します.つまり、伝達パラメータを定数参照に変更します.
構造関数はいつ呼び出されますか?
1静的ストレージクラスオブジェクトが作成されている場合、その構造関数はプログラムの終了時に自動的に呼び出されます.
2.自動格納クラスオブジェクトが作成されている場合、その構造関数は、プログラムがコードブロックを実行したときに自動的に呼び出されます.
3.オブジェクトがnewによって作成された場合、スタックメモリまたはフリーストレージ領域に存在し、deleteを使用してメモリを解放すると、その構造関数が自動的に呼び出されます.
4.特定の操作を完了するために一時オブジェクトを作成します.この場合、プログラムは、そのオブジェクトの使用を終了すると、その構造関数を自動的に呼び出します.
例:
CMyString& CMyString::operator = ( const CMyString &str )
{
    if( this != &str )
    {
        CMyString strTemp( str );
        
        char* pTemp = strTemp.m_pData;
        strTemp.m_pData = m_pData;
        m_pData = pTemp;
    }
    
    return *this;
}
次のCMyStringタイプの例外的セキュリティを実装するための代入演算子関数です.
class CMyString
{
public:
    CMyString( char* pData = NULL );
    CMyString( const CMyString& str );
    ~CMyString( void );
    
private:
    char* m_pData;
};

strTempは局所変数であるため、プログラムがifの外に実行されるとその変数の役割ドメインが出て、strTempの構造関数を自動的に呼び出し、strTempをm_pDataが指すメモリは解放されます.