对象上的赋值操作符

assignment operator on objects

本文关键字:赋值操作符 对象      更新时间:2023-10-16

我是编程新手,基于谷歌搜索,第一击总是'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 

您正在查看的是'操作符重载'。在这种技术中,您为现有的操作符定义一个新的行为,在本例中是'='。基本上,当在main()中调用该操作符时,它将右侧操作数的成员值赋给左侧操作数的成员。

正如您所指出的,p_y = p_x;只是一个简单的指针赋值。这是因为您重载了wood的赋值操作符,而不是wood*的。

p_y = p_x;改为*p_y = *p_x;

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