クラスStringのコンストラクション関数、コピーコンストラクション関数、コンストラクション関数、割り当て関数の作成

5068 ワード

一、テーマ:

class String
{
public:
    String(const char *str = NULL); //      
    String(const String &other);    //  
    ~String(void);                    //      
    String & operator = (const String &other);    //  
private:
    char *m_data;                    //  
};

各解析:

1、コンストラクタ


/* 
1、コンストラクション関数はオブジェクトを構築する時に使用する.2、入力パラメータの判断;3、オブジェクトの初期化問題.*/
String::String(const char *str)
{
    if ( NULL == str)
    {
        m_data = new char[1]
        *m_data = '\0';
    }
    else
    {
        int len = strlen(str);
        m_data = new char[len + 1];
        strcpy(m_data,str);
    }
}

2、コピー構造関数


/*1、コピーコンストラクション関数は、オブジェクトを構築するときに使用する必要があります.すなわち、オブジェクトを定義するときです.2、オブジェクト初期化の問題.*/
String::String(const String &other)
{
    int len = strlen(other.m_data);
    m_data = new char[len+1];
    strcpy(m_data,other.m_data);
}

3、代入関数


/*1、付与関数を使用する場合、オブジェクトは必ず確立されています.2、賦値する前に、自己賦値かどうかを判断する.3、値を割り当てる前に、メモリ空間の準備:値を割り当てる前に、オブジェクトはすでに一定の大きさのメモリを占有しているが、値を与えるオブジェクトが占めるメモリの大きさはオブジェクトが占めるメモリの大きさと一定ではない.オブジェクトが占有しているメモリを解放してから、ハートメモリを割り当てます.4、通常付与*/
String & String::operator = (const String &other)
{
    if (&other == this)
    {
        return *this;
    }
    
    delete [] m_data;
    int len = strlen(other.m_data);
    m_data = new char[len+1];
    strcpy(m_data,other.m_data);
    
    return *this;
}

4、解析関数


/*リソースの解放*/
String::~String(void)
{
    delete []m_data;
}

5、コピー構造関数と賦値関数に関する知識


1、コピーコンストラクション関数と付与関数の違い?


[=](=)オペレータがオブジェクトに割り当てられているのを見たとき、
オブジェクト定義時(Test B=(Test)c)の場合、コピーコンストラクタが呼び出されます.
オブジェクトが割り当てを定義していない場合(B=c)、割り当て関数が呼び出されます.
注意:コンストラクション関数、コピーコンストラクション関数は、名前の通り、オブジェクトの宣言または定義時に使用されるコンストラクション関数です.

2、コピーコンストラクション関数と付与関数の定義の違い?


メモリ領域の角度:
1)コピーコンストラクション関数の使用は、オブジェクトの作成時である.オブジェクトがメモリを占有していなかったため、メモリを解放する必要はなく、メモリ領域を再構築しませんでした.
2)付与関数の使用は、オブジェクトが作成された後である.オブジェクトがメモリを占有しているため、以前のメモリを解放してメモリ領域を再取得する必要があります.