2013-03-20 3 views
0

Я новичок в программировании, основанный на поиске Google, первый удар всегда был «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

Если вы новичок в программировании, код, который вы ищете, слишком много для вас, ИМО. То, что они делают, это перегрузка оператора для оператора присваивания. То, что он делает, переопределяет способ работы «=», назначая имя и цвет дерева .. но по умолчанию он будет присваивать адрес только объекту. – chuthan20

ответ

0

Что вы ищете, это «перегрузка оператора». В этом методе вы определяете новое поведение для существующего оператора, в этом случае оно равно '='. В основном, когда этот оператор вызывается в main(), он принимает его правый операнд и присваивает его значениям членам членам операнда левой стороны.

0

Как вы отметили, p_y = p_x; - это просто назначение указателя. Это связано с тем, что вы перегрузили оператор присваивания для wood, а не для wood*.

Изменить p_y = p_x;*p_y = *p_x;.

Вы можете реализовать свободную функцию для перегрузки operator= для wood*, но я не думаю, что это хорошая идея.

+0

Благодаря ** Henrik и Rakesh **. Я немного озадачен этой перегрузкой оператора присваивания '=', как это работает в первом случае i.e b = a; где «a» и «b» создаются в стеке, тогда как p_y = p_x; где p_y & p_x создаются в куче. Как создать перегрузку оператора оператора для «дерева» ?. Я ценю группу «stackoverflow», люди очень умны, мои основные принципы становятся ясными, читая наши вопросы и ответы. _italic_ делать это, т. е. >> Изменить 'p_y = p_x; to * p_y = * p_x; 'работает, спасибо. –

Смежные вопросы