【问题标题】:making a object equal to another object使一个对象等于另一个对象
【发布时间】:2009-09-14 08:37:10
【问题描述】:

我知道当声明其中一个对象时,您可以使两个对象彼此相等。我在我的程序中对此进行了测试。但是当我去使用赋值语句时,它吓坏了。您可以使用赋值语句使两个对象彼此相等,还是只能在声明一个对象时才这样做?

【问题讨论】:

    标签: c++ object equals


    【解决方案1】:

    您已将 operator= 提供给一个类,以便复制另一个对象的内容。例如:

    class A
    {
      public:
    
       //Default constructor
       A();
    
       //Copy constructor
       A(const A&);
    
       //Assignment operator
        A& operator=(const A& a);
    };
    
    int main()
    {
      A a; //Invokes default constructor
      A b(a); //Invokes copy constructor;
      A c;
      c = a; //Invokes assignment operator
    }
    

    【讨论】:

    • 但是你可以使用赋值(c = a)而不用重载=操作符
    • 是的,这就是为什么我把它写成两个不同的语句
    • @Ahmed 说:如果您没有明确定义一个,那么编译器会自动为您生成一个。
    【解决方案2】:

    重载该对象的赋值运算符可以帮助您。 (我希望你说的是同一类的对象:))

    【讨论】:

      【解决方案3】:

      对于赋值运算符,只需根据您的类实现重载赋值运算符即可。

      【讨论】:

        【解决方案4】:

        当对象依赖于其他对象时,可能需要该对象初始化或创建或等同于另一个对象。

        在这种情况下,复制构造函数给出了最好的解决方案..因为它不会将对象逐位复制到其他对象。如果内存是动态分配给对象的,则按位复制会产生问题。所以,解决方案是在类中定义copy_constructor。复制构造函数引用一个与它的参数相同类型的现有对象,它用于从现有对象创建一个新对象。这是一个使用复制构造函数将对象与其他对象等同起来的示例。

        #include "stdafx.h"
        #include "iostream"
        using namespace std;
        class array
        {
        int *ptr;
        int size;
        public:
        array (int sz) {
        ptr = new int [sz];
        size =sz;
        for(int index=0;index<size;index++)
        ptr[index]=size;
        }
        ~array(){
        delete[] ptr;
        }
        array(array &a) {
        int index;
        ptr=new int[a.size];
        for(index=0;index<a.size;index++)
        ptr[index]=a.ptr[index];
        cout<<"copy_constructor invoked"<<endl;
        }
        };
        
        int _tmain(int argc, _TCHAR* argv[])
        {
        array num(10);
        array x(num); //invokes copy_constructor
        array y=num; //invokes copy consturctor
        
        return 0;
        }
        

        【讨论】:

        • 某种方式,代码无法逐行插入..我不确定
        【解决方案5】:

        此答案适用于 C#。

        除了重载 = 运算符,您还应该覆盖 equals 方法。您还应该检查 Guidelines 的重载 Equals() 和运算符 ==

        public struct Complex 
        {
           double re, im;
           public override bool Equals(Object obj) 
           {
              return obj is Complex && this == (Complex)obj;
           }
           public override int GetHashCode() 
           {
              return re.GetHashCode() ^ im.GetHashCode();
           }
           public static bool operator ==(Complex x, Complex y) 
           {
              return x.re == y.re && x.im == y.im;
           }
           public static bool operator !=(Complex x, Complex y) 
           {
              return !(x == y);
           }
        }
        

        【讨论】: