2013-03-20 101 views
0

我是新手编程,基于谷歌搜索,第一次命中总是'stackoverflow', 它一直很有帮助。我没有得到这部分的答案。它是一个简单的代码,我 一直在尝试学习赋值操作符如何处理对象。我已经看了一些 书,没有例子。对象的赋值运算符

// wood.h 
using namespace std; 

///#include <cstdio> 
//#include <cstdlib> 
//#include <iostream> 
//#include <string> 

class wood { 
public : 
wood (void); 
    wood (string type, string color) ; 
    void display(void);` 
    wood & operator=(const wood &copy  ); 
    wood & operator=(const wood * const &copy); 
    private : 
    string  m_color; 
    string  m_name; 
    }; 
// wood.cc 
wood:: wood (string name, string color) { 
    m_name = name; 
    m_color = color; 
} 
wood & wood::operator=(const wood &from) {` 
    cout << "calling assignment construction of" << from.m_name << endl; 
    m_name = from.m_name; 
    m_color = from.m_color; 
    return *this; 
} 
void wood::display (void) {` 
    cout << "name: " << m_name << " color: " << m_color << endl; 
} 
// test_wood.cc 
int main() 
{ 
    wood *p_x, *p_y;` 
    wood a("abc", "blue"); 
    wood b("def", "red"); 
    a.display(); 
    b.display(); 
    b = a;   // calls assignment operator, as I expected` 
    a.display();` 
    b.display();` 
    p_x = new wood ("xyz", "white"); 
    p_y = new wood ("pqr", "black"); 
    p_x->display();` 
    p_y->display();` 

    p_y = p_x; // Here it doesn't call assignment operator, Why? 
       // It does only pointer assignement, p_y original pointer goes into ether. 
    p_x->display();` 
    p_y->display();` 
    printf("p_x:%p, p_y:%p \n", p_x, p_y); 

return 0; 
} 
//output: 
name: abc color: blue 
name: def color: red 
calling assignment construction abc 
name: abc color: blue 
name: abc color: blue 
name: xyz color: white 
name: pqr color: black 
name: xyz color: white 
name: xyz color: white 
p_x:0x9be4068, p_y:0x9be4068 
+1

如果您是编程新手,您所查看的代码对您而言有点过分,IMO。他们正在做的是分配操作员的操作员重载。它所做的是通过指定木材的名称和颜色来覆盖“=”的工作方式。但默认情况下,它只会分配对象的地址。 – chuthan20 2013-03-20 13:19:28

回答

0

你在看什么是'操作员超载'。在这种技术中,你为现有的操作员定义了一个新的行为,在这种情况下它是'='。基本上,当在main()中调用该运算符时,它将占用右侧操作数,并将其成员值分配给左侧操作数的成员。

0

如您所述,p_y = p_x;只是一个简单的指针分配。 这是因为您为wood重载了赋值运算符,而不是wood*

更改p_y = p_x;*p_y = *p_x;

你可以实现一个免费函数来重载operator=wood*,但我认为这不是一个好主意。

+0

感谢** Henrik和Rakesh **。我对这个'='赋值运算符的超载感到困惑,在前一种情况下它是如何工作的,即b = a;其中'a'和'b'是堆栈创建的,而p_y = p_x;其中p_y&p_x是在堆中创建的。如何为'wood *'创建赋值运算符重载?我很欣赏'stackoverflow'组,人们非常聪明,我的基础知识通过阅读我们的Q&A /常见问题得到了解。 _italic_这样做,即>>更改'p_y = p_x; to * p_y = * p_x;'作品,谢谢。 – 2013-03-20 17:12:34