我是编程的新手,基于谷歌搜索,第一次点击始终是'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 © );
wood & operator=(const wood * const © );
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
答案 0 :(得分:0)
您所看到的是“运营商超载”#39;在此技术中,您为现有运算符定义新行为,在这种情况下,它是&#39; =&#39;。基本上,当在main()中调用此运算符时,它会使用它的右侧操作数并将其成员值分配给左侧操作数的成员。
答案 1 :(得分:0)
正如您所指出的,p_y = p_x;
只是一个简单的指针赋值。
这是因为您重载了wood
的赋值运算符,而不是wood*
。
将p_y = p_x;
更改为*p_y = *p_x;
。
您可以为operator=
实现一个免费函数来重载wood*
,但我认为这不是一个好主意。