C ++对象相等

时间:2013-05-30 18:22:24

标签: c++ pointers equality

我有一个类MyCloth和我实例化的那个类的一个对象实例:

MyCloth** cloth1;

在程序的某一点上,我会做这样的事情:

MyCloth** cloth2 = cloth1;

然后在某个时候,我想查看cloth1cloth2是否相同。 (像Java中的对象相等,只有这里,MyCloth是一个非常复杂的类,我不能构建一个isEqual函数。)

我该如何进行这种平等检查?我想也许可以检查他们是否指向相同的地址。这是一个好主意吗?如果是这样,我该怎么做?

2 个答案:

答案 0 :(得分:12)

您可以通过比较两个指针所包含的地址来测试对象身份。你提到Java;这类似于测试两个引用是相等的。

MyCloth* pcloth1 = ...
MyCloth* pcloth2 = ...
if ( pcloth1 == pcloth2 ) {
    // Then both point at the same object.
}   

您可以通过比较两个对象的内容来测试对象相等。在C ++中,通常通过定义operator==来完成。

class MyCloth {
   friend bool operator== (MyCloth & lhs, MyCloth & rhs );
   ...
};

bool operator== ( MyCloth & lhs, MyCloth & rhs )
{
   return ...
}

使用operator ==定义,您可以比较相等:

MyCloth cloth1 = ...
MyCloth cloth2 = ...
if ( cloth1 == cloth2 ) {
    // Then the two objects are considered to have equal values.
}   

答案 1 :(得分:4)

如果您想定义一种方法,可以通过该方法对客户类的一组对象进行比较。例如:

someClass instance1;
someClass instance2;

你可以通过重载<本课程的操作员。

class someClass
{

    bool operator<(someClass& other) const
    {
        //implement your ordering logic here
    }
};

如果您想要做的是比较,并查看对象是否是字面上相同的对象,您可以进行简单的指针比较,看看它们是否指向同一个对象。我觉得你的问题措辞不好,我不确定你会选择哪个。

编辑:

对于第二种方法,它真的很容易。您需要访问对象的内存位置。您可以通过多种方式访问​​它。以下是一些:

class someClass
{

    bool operator==(someClass& other) const
    {
        if(this == &other) return true; //This is the pointer for 
        else return false;
    }
};

注意:我不喜欢上述内容,因为通常==运算符比仅仅比较指针更深入。对象可以表示具有相似质量的对象而不相同,但这是一个选项。你也可以这样做。

someClass *instancePointer = new someClass();
someClass instanceVariable;
someClass *instanceVariablePointer = &instanceVariable;


instancePointer == instanceVariable;

这是非感性的,无效/错误。如果它甚至会编译,取决于你的标志,希望你使用不允许这个的标志!

instancePointer == &instanceVariable; 

这是有效的,会导致错误。

instancePointer == instanceVaribalePointer;  

这也是有效的,会导致错误。

instanceVariablePointer == &instanceVariable;

这也是有效的,会导致TRUE

instanceVariable == *instanceVariablePointer;

这将使用我们上面定义的==运算符来获得TRUE的结果;