我想确定我的理解是否正确。
我正在研究这段代码。
#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或其他案例中推荐什么样的写作风格?
答案 0 :(得分:1)
这是否意味着案例1不是案例2?
m_pData =新数据(*(rhs.m_pData)); //案例1
m_pData =新数据(*(rhs).m_pData); //案例2
这意味着案例1。
在这种代码中,你在0-2或其他案例中推荐什么样的写作风格?
我总是避免多余的括号,实际上是多余的。
答案 1 :(得分:1)
case 1
与case 2
相同。在c ++中,'.' operator
的优先级高于'*' operator
,您的括号不会更改优先级。 case 1
和case 2
都是正确的。
我想你想说的是
m_pData = new Data((*rhs).m_pData);
,这是错误的。
您可以阅读运营商优先级表:level.http://en.cppreference.com/w/cpp/language/operator_precedence