0

私の理解が正しいかどうかを確認したいと思います。

私はこのコードについて勉強していました。

#include <iostream>
using namespace std;

// modified largely from
// http://d.hatena.ne.jp/toburau/20090722/1248283158

/*
class Test {
public:
    Test& operator=(const Test& rhs);
};
Test& Test::operator=(const Test& rhs)
{
    if (this == &rhs) return *this;          // *****
};
*/

//-----------------------------------------------------

class Data
{
    int num;
public:
    Data(void) : num(0) { }
    Data(int _num) : num(_num) { }
    Data(const Data &rhs) {
        cout << "copy constructor is called" << endl;
        num = rhs.num;
    }
    void show(void) {
        cout << num << endl;
    }
};

class CopyTest {
    Data *m_pData;
public:
    CopyTest(void) {
        m_pData = new Data(0);
    }
    CopyTest(int _num) {
        m_pData = new Data(_num);
    }
    void show(void) {
        m_pData->show();
    }
    CopyTest& operator=(const CopyTest& rhs);
};

CopyTest& CopyTest::operator=(const CopyTest& rhs) /*****/
{
    Data *p = m_pData;
    m_pData = new Data(*rhs.m_pData); // case 0 // OK // copy constructor is called
//  m_pData = new Data(*(rhs.m_pData)); // case 1 // OK
//  m_pData = new Data(*(rhs).m_pData)); // case 2 // NG
    delete p;
    return *this;
}


int main() {
    CopyTest cpyObjA, cpyObjB(31);

    cpyObjA.show();
    cpyObjB.show();

    cout << "## after" << endl; 
    cpyObjA = cpyObjB;
    cpyObjA.show();
    cpyObjB.show();

    return 0;
}

行番号と色付きのコードについては、 http://ideone.com/7qnzLPを参照 してください。

このコード (53 行目) には、次のようなコードがあります。

 m_pData = new Data(*rhs.m_pData); // case 0

これは、ケース 2 ではなくケース 1 という意味ですか?

 m_pData = new Data(*(rhs.m_pData)); // case 1
 m_pData = new Data(*(rhs).m_pData); // case 2

この種のコードでは、case 0-2 またはその他の中で、どのような書き方をお勧めしますか?

4

2 に答える 2

1

あなたcase 1は と同じcase 2です。C++ では、 の優先度'.' operatorは よりも高く'*' operator、括弧は優先度を変更しません。そして、どちらcase 1case 2正しいです。あなたの言いたいことは m_pData = new Data((*rhs).m_pData);、間違っていると思いました。オペレーターの優先順位の表を読むことができます: level.http://en.cppreference.com/w/cpp/language/operator_precedence

于 2013-10-18T01:39:34.853 に答える
1

これは、ケース 2 ではなくケース 1 という意味ですか?

m_pData = new Data(*(rhs.m_pData)); // ケース 1

m_pData = new Data(*(rhs).m_pData); // ケース 2

ケース1という意味です。

この種のコードでは、case 0-2 またはその他の中で、どのような書き方をお勧めしますか?

私は常に冗長な括弧を避けます。実際、冗長なものは何でもです。

于 2013-10-18T01:01:07.040 に答える