C++三大関数(The Big Three)

2033 ワード

本文はMarkdownで編集して、ここはMarkdownに対する支持が完備していないで、もっと良い読書体験は移動してください:私のMarkdownテキスト
C++三大関数:
  • 解析関数
  • 複製構造関数
  • operator=

  • こうぞうかんすう
    関数パターン:~S()
    オブジェクトが役割ドメインを超えたりdeleteを実行したりすると、構造関数が呼び出されます.
    コンストラクタのコピー
    関数パターン:S(const S&s)
    以下の場合、レプリケーションコンストラクション関数が呼び出されます.
  • 宣言と同時に初期化:
    S s1 = s2;  //        =,      operator= 
    
    S s1(s2);
    
    
  • 関数を呼び出すときは、参照ではなく値で渡す
    void f(S s);
    
    S s1;
    
    f(s1);
    
    
  • を使用します.
  • 値によりオブジェクト
    S f()
    
    {
    
        S s1;
    
        return s1;
    
    }
    
    
  • に戻る.
    operator=
    関数パターン:const S&operator=(const S&s)
    =が2つの構築済みオブジェクトに適用されると、レプリケーション付与演算子operator=が呼び出されます.
    S s1;
    
    s1 = s2;    //   S s1 = s2;    
    
    

    注意事項:
  • の3つの関数が手動で実現されない場合、デフォルトのバージョンが使用されます.たとえばoperator=のデフォルトバージョンでは、データ・メンバーが順次コピーされます.基本データ型であれば問題ありませんが、データ・メンバーにポインタが含まれている場合、operatorは しか行われません.つまり、ポインタが指す内容ではなく、ポインタ自体がコピーされます.次の例を参照してください.
    class S
    
    {
    
        public:
    
        int *p;
    
        S(int x=0){p=new int(x);}
    
    };
    
    void f()
    
    {
    
        S s1(2), s2;
    
        S s3 = s1;
    
        s2 = s1;
    
        *s1.p=3;
    
        cout << *s1.p << ' '<< *s2.p << ' ' << *s3.p << endl;//3 3 3
    
    }
    
    
    は明らかにこれは私たちが望んでいるものではありません.私たちは異なるオブジェクトの値が互いに影響しないようにしたいと思っています.この場合、 を実現する必要があります.次の例を参照してください.
    class S
    
    {
    
        public:
    
        int *p;
    
        S(int x=0){p=new int(x);}
    
        S(const S& rhs)
    
        {
    
            p = new int(*rhs.p);
    
        }
    
        const S& operator=(const S& rhs)    //rhs=right-hand side
    
        {
    
            if (this != &rhs)   //         
    
                *p = *rhs.p;
    
            return *this;
    
        }
    
    };
    
    void f()
    
    {
    
        S s1(2), s2;
    
        S s3 = s1;
    
        s2 = s1;
    
        *s1.p=3;
    
        cout << *s1.p << ' '<< *s2.p << ' ' << *s3.p << endl;   //3 2 2
    
    }