(* rhs.m_pData)的含义

时间:2013-10-18 00:41:00

标签: c++ pointers

我想确定我的理解是否正确。

我正在研究这段代码。

#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

这是否意味着案例1不是案例2?

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

在这种代码中,你在0-2或其他案例中推荐什么样的写作风格?

2 个答案:

答案 0 :(得分:1)

  

这是否意味着案例1不是案例2?

     

m_pData =新数据(*(rhs.m_pData)); //案例1

     

m_pData =新数据(*(rhs).m_pData); //案例2

这意味着案例1。

  

在这种代码中,你在0-2或其他案例中推荐什么样的写作风格?

我总是避免多余的括号,实际上是多余的。

答案 1 :(得分:1)

case 1case 2相同。在c ++中,'.' operator的优先级高于'*' operator,您的括号不会更改优先级。 case 1case 2都是正确的。 我想你想说的是 m_pData = new Data((*rhs).m_pData);,这是错误的。 您可以阅读运营商优先级表:level.http://en.cppreference.com/w/cpp/language/operator_precedence