ポインタメンバー付きクラスの構築関数、コピー関数、付与関数のまとめ

5671 ワード

1.クラスのコード
#pragma warning(disable:4996)
#include
#include
using namespace std;
class StrBlobPtr
{
public:
    //    1    ,     (     , new    ,      )
    StrBlobPtr() : ptrChar(new char[1024]), n(0){}   //           
    //    2,     
    StrBlobPtr(char*,size_t);     //            (      ,    )

    //         
//  StrBlobPtr(const StrBlobPtr&);
    //       
    StrBlobPtr &operator=(const StrBlobPtr & rhs)
    {
        cout << "        " << endl;
        char *ptrCharNew = new char[1024];
        delete ptrChar;
        ptrChar = ptrCharNew;
        strcpy(ptrChar, rhs.ptrChar);
        n = rhs.n;
        return *this;
}
    ~StrBlobPtr(){ delete  ptrChar; };
    void  Print()const;
    //                  
    int set_val(const int &) ;
    char* set_str_val(char * );
private:
    char *ptrChar;
    size_t n;
};
StrBlobPtr::StrBlobPtr(char *cstr,size_t pa)   //    2
{
    ptrChar=new char[1024];
    strlen(ptrChar,cstr);
    n=pa;
}

StrBlobPtr::StrBlobPtr(const StrBlobPtr&rhs)//         
{
    ptrChar = new char[strlen(rhs.ptrChar) + 1];
    strcpy(ptrChar, rhs.ptrChar);
    n = rhs.n;
}
int StrBlobPtr::set_val(const int &x) 
{
    n = x;
    return n;
}
char *StrBlobPtr::set_str_val(char* ptr)
{
    *ptrChar = *ptr;
    return  ptrChar;
}
void StrBlobPtr::Print()const
{
    cout << ptrChar<<"\t"<int main()
{
    StrBlobPtr A("Bane",100);   //      2
    StrBlobPtr B(A);            //      (         )
    A.Print();                  //         
    B.Print();              

    B.set_val(10);             //     B      n
    B.set_str_val("Tom");      //     B      *ptrChar

    A.Print();                 //           A B   
    B.Print();

    //       
    StrBlobPtr C;
    C = A;
    system("pause");
    return 0;
}

2.クラスの解析2.1コンストラクタ(パラメータは限定されず、複数可)一般的なコンパイラは、デフォルトのコンストラクタを自分で追加し、メンバー変数を初期化する役割を果たします.しかし、すべてのクラスは、コンパイラが独自に合成したデフォルトのコンストラクション関数に依存しているわけではありません.コンストラクション関数を自分で追加する必要がある場合があります.
  • デフォルトのコンストラクション関数:スタックスペースを開かず、スタックメモリを割り当てるだけで、コンパイラによって自動的に作成および破棄できます.
  • カスタムコンストラクタ:デフォルトのコンストラクタを完全に置き換えることができ、ダイナミックメモリを開き、スタックスペースを申請することができ、後で表示されるようにコンストラクタ破棄を呼び出す必要があります.
  • この例では、メンバー変数にポインタが含まれているため、構造関数をカスタマイズして動的メモリを申請する必要があります.

  • 2.2コピーコンストラクション関数(StrBlobPtr(const StrBlobPtr&))は、コンパイラがデフォルトのコピー関数を追加するのが一般的ですが、カスタムコンストラクション関数を使用してダイナミックメモリを要求すると、深度コピー(コピー内容)の役割を果たすには、コピーコンストラクション関数をカスタマイズする必要があります.そうしないと、浅いコピー(コピーはポインタです).
  • プログラム実行効果
             ,         2      ,      A,  A   B,            ,  B    ,   A;             ,  B    ,A  。
    
  • 2.3代入オペレータ(リロードに関する問題は後で検討する)3.個人まとめ
  • 深さレプリケーションでは、スタック内の付与値が直接レプリケーション値(一般化された深さレプリケーション)であるため、浅いレプリケーションの概念はスタック空間を開いた場合にのみ存在する.
  • char*についての検討は後期に続きます.