44155


  1. 「////////」となっている部分のコードの意味を知りたいです。
  2. [自分自身だったら...]の場合はどのような場合か知りたりです。
  3. この処理内容はどの場合に実行されるのか検証しましたがprintfで出力されないのでそのあたりを教えていただきたいです。

[code]

    #ifndef ___IntArray
    #define ___IntArray
    #include <iostream>
    using namespace std;
    
    class IntArray {
        private:
            int nelem;
            int *vec;
    
        public:
            IntArray() {};
    
        explicit IntArray(int size) :nelem(size)
        {
            vec = new int[nelem];
        };
    
        int size()const {
            return nelem;
        }
    
        int& operator[](int i) {
            return vec[ i ];
        }
    
        ~IntArray() {
            delete[] vec;
        }
    
        /*コピーコンストラクタ*/
        IntArray(const IntArray& x)
        {
            if (&x == this) // もし自分自身だったら...
            {
                cout << "同じ";
                ////////////
                nelem = 0;
                vec = NULL;
                /////////////
            }
            else {
                nelem = x.nelem;
                vec = new int[nelem];
    
                int i = 0;
                for (i = 0; i < nelem; i++) {
                    vec[i] = x.vec[i];
                }
            }
        }
    
        IntArray& operator = (const IntArray& x) {
    
            if (&x != this)
            {
                if (nelem != x.nelem)
                {
                    delete[] vec;
                    nelem = x.nelem;
                    vec = new int[nelem];
                }
    
                int i = 0;
                for (i = 0; i < nelem; i++) {
                    vec[i] = x.vec[i];
                }
            }
            else { cout << "else"; }
    
            return *this;
        }
    };
    
    #endif;
    
[/code]


CC BY-SA 4.0
2018-05-22T10:27:07.937
44154
2018-05-22T11:40:49.173
2018-05-22T11:40:49.173
3060
question
c++
記憶域の動的確保クラス


>   1. 「////////」となっている部分のコードの意味を知りたいです。
>

普通にメンバー変数を初期化しているだけで特殊なことはありません。

>   2. [自分自身だったら...]の場合はどのような場合か知りたりです。
>

通常はオブジェクトを作成する際にコンストラクターを実行します。  
コピーコンストラクターではコピー元のオブジェクトを引数に渡します。  
ここまでは一般的です。

そのうえで質問の状況、コピーコンストラクターの引数に自分自身が渡されるというのはかなり特殊な状況です。ただし不可能ではありません。

[code]

    auto p = (IntArray*)malloc(sizeof(IntArray));
    new (p) IntArray(*p);
    
[/code]

２行目は`placement
new`といって、指定したアドレスに対してコンストラクターを実行させることができます。`(p)`がコンストラクターを実行させるアドレスを指します。`(*p)`がコンストラクター引数です。


CC BY-SA 4.0
2018-05-22T10:58:26.723
44155
2018-05-22T10:58:26.723
4236
44154
answer