2013-03-20 104 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