#include <iostream>
using namespace std;
// modified largely from
// http://d...content-available-to-author-only...e.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 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gbW9kaWZpZWQgbGFyZ2VseSBmcm9tCi8vIGh0dHA6Ly9kLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmpwL3RvYnVyYXUvMjAwOTA3MjIvMTI0ODI4MzE1OAoKLyoKY2xhc3MgVGVzdCB7CnB1YmxpYzoKCVRlc3QmIG9wZXJhdG9yPShjb25zdCBUZXN0JiByaHMpOwp9OwpUZXN0JiBUZXN0OjpvcGVyYXRvcj0oY29uc3QgVGVzdCYgcmhzKQp7CglpZiAodGhpcyA9PSAmcmhzKSByZXR1cm4gKnRoaXM7CSAgICAgICAgIC8vICoqKioqCn07CiovCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBEYXRhCnsKCWludCBudW07CnB1YmxpYzoKCURhdGEodm9pZCkgOiBudW0oMCkgeyB9CglEYXRhKGludCBfbnVtKSA6IG51bShfbnVtKSB7IH0KCURhdGEoY29uc3QgRGF0YSAmcmhzKSB7CgkJY291dCA8PCAiY29weSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQiIDw8IGVuZGw7CgkJbnVtID0gcmhzLm51bTsKCX0KCXZvaWQgc2hvdyh2b2lkKSB7CgkJY291dCA8PCBudW0gPDwgZW5kbDsKCX0KfTsKCmNsYXNzIENvcHlUZXN0IHsKCURhdGEgKm1fcERhdGE7CnB1YmxpYzoKCUNvcHlUZXN0KHZvaWQpIHsKCQltX3BEYXRhID0gbmV3IERhdGEoMCk7Cgl9CglDb3B5VGVzdChpbnQgX251bSkgewoJCW1fcERhdGEgPSBuZXcgRGF0YShfbnVtKTsKCX0KCXZvaWQgc2hvdyh2b2lkKSB7CgkJbV9wRGF0YS0+c2hvdygpOwoJfQoJQ29weVRlc3QmIG9wZXJhdG9yPShjb25zdCBDb3B5VGVzdCYgcmhzKTsKfTsKCkNvcHlUZXN0JiBDb3B5VGVzdDo6b3BlcmF0b3I9KGNvbnN0IENvcHlUZXN0JiByaHMpIC8qKioqKi8KewoJRGF0YSAqcCA9IG1fcERhdGE7Ci8vCW1fcERhdGEgPSBuZXcgRGF0YSgqcmhzLm1fcERhdGEpOyAvLyBjYXNlIDAgLy8gT0sgLy8gY29weSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQKLy8JbV9wRGF0YSA9IG5ldyBEYXRhKCoocmhzLm1fcERhdGEpKTsgLy8gY2FzZSAxIC8vIE9LCgltX3BEYXRhID0gbmV3IERhdGEoKihyaHMpLm1fcERhdGEpKTsgLy8gY2FzZSAyIC8vIE5HCglkZWxldGUgcDsKCXJldHVybiAqdGhpczsKfQoKCmludCBtYWluKCkgewoJQ29weVRlc3QgY3B5T2JqQSwgY3B5T2JqQigzMSk7CgkKCWNweU9iakEuc2hvdygpOwoJY3B5T2JqQi5zaG93KCk7CgoJY291dCA8PCAiIyMgYWZ0ZXIiIDw8IGVuZGw7CQoJY3B5T2JqQSA9IGNweU9iakI7CgljcHlPYmpBLnNob3coKTsKCWNweU9iakIuc2hvdygpOwoJCglyZXR1cm4gMDsKfQ==