使用cpp中的指针表达式进行指针对象比较

时间:2017-02-20 04:46:48

标签: c++ class pointers object

我创建了一个类' myclass '

的双指针对象
myclass *obj1,*obj2;

我可以使用比较运算符和指针表达式比较这两个对象,即*obj1==*obj2

如果是,该怎么办?
如果没有,为什么不允许他?

6 个答案:

答案 0 :(得分:0)

  

我可以使用比较运算符和指针表达式比较这两个对象,即*obj1==*obj2

从整体上讲,只有在为类定义运算符时才能这样做。您可以通过重载operator==函数来实现,该函数可以是成员函数或非成员函数。

仅当obj1obj2指向有效对象时,它才会在运行时工作。

如果obj1obj2指向有效对象,*obj1 == *obj2将会像您有

一样工作
MyClass o1;
MyClass o2;

并使用o1 == o2

答案 1 :(得分:0)

是的,这会有效,但前提是你的班级==运营商超载了。如果有,那么==将调用适当的operator==方法,该方法为您的类实现相等性测试。换句话说,由您来定义平等对您的班级意味着什么。

答案 2 :(得分:0)

指针上的

==运算符将比较它们的数字地址,从而确定*obj1和* obj2是否指向同一个对象。

bool operator==(const myclass &obj2); // in this method, see if obj2 is equal to *this.

答案 3 :(得分:0)

您建议的代码仅在myclass定义operator ==。

时才有效

正如Jeremy Friesner所指出的那样,你需要注意无效指针,特别是值NULL(或nullptr)。

所以你真正想要的是: if((obj1!= nullptr)&&(obj2!= nullptr(&&(* obj1 == * obj2))...

我还建议将这些标识符更改为ptr1和ptr2,因为“obj1”和“obj2”会向普通读者暗示它们是对象而不是指向对象的指针。或者myclsptr1和myclsptr2,作为读者指出他们指向什么样的东西。或者,更好的是,这些名称表明了他们在该计划的这一部分的目的。

答案 4 :(得分:0)

1.Pointer to class类似于指向Structure的指针,如果你想比较,你必须访问并比较每个成员。

2.您可以比较 obj1 == obj2 (比较地址),但如果要比较两个对象 * obj1 == * obj2 ,则需要重载& #34; =="您的" myclass "中的运算符像这样:::

bool operator==(const myclass& b) {//Compare methods or variables of both objects and return result bool(true/false)

答案 5 :(得分:0)

  

如果是,那怎么回事?   如果没有,为什么不允许他?

简而言之,如果你已经定义了一个合适的operator ==函数来比较myclass个实例,那么答案将是,如果你没有,那么定义了一个合适的operator ==函数。

有两种方法可以声明operator ==函数 - 作为MyClass类的成员函数或作为非成员函数(有时称为全局函数或自由函数)。

声明MyClass成员函数可能看起来像这样......

class MyClass
{
public:

    bool operator == (const MyClass &rhs) const
    {
        bool result{ false };

        // calculate result;

        return result;
    }

    // ... etc ...
};

鉴于语句if (*obj1 == *obj2)*obj1实例上将调用上述成员函数(即,this将引用*obj1*obj2 instance将作为参数传递给参数rhs

或者,MyClass的相等比较运算符可以声明为非成员(也称为全局)函数...

bool operator == (const MyClass &lhs, const MyClass &rhs) 
{
    bool result{ false };

    // calculate result;

    return result;
}

在这种情况下,给定语句if (*obj1 == *obj2)将调用上面的函数,并将*obj1实例作为lhs参数的参数传递,并传递*obj2实例作为rhs参数的参数。

您不能使用相同的签名声明成员函数和非成员函数operator ==。编译器无法决定调用哪一个!

无论您使用哪种技术来声明operator ==函数,"计算结果"代码可以是对您的特定类有意义的任何内容,只要它返回truefalse

通常,您将比较两个对象的各个成员,如果这些成员保持相同的值,则返回true。但您可能无法比较所有成员。例如,考虑以下Book类......

class Book
{
public:

   std::string Title;
   std::string Author;
   std::string Isbn;

   // ... etc ...
};

如果两个实例具有相同的ISBN值,您可能会认为operator ==应该返回true,因为 The Hitchhiker的银河系指南这本书的不同版本应该是认为不同。或者,如果两个Book实例具有相同的TitleAuthor,则可能会认为这两个const MyClass &实例相同,因为指南的平装版和精装版可能具有不同的ISBN,但它们仍然存在(在某种意义上)同一本书。

最后(!)应该注意,虽然上面的示例代码使用rhs作为rhs参数的类型,但C ++不要求lhs参数是相同的类型作为operator ==参数。

通常情况下,定义一个{{1}}函数来比较两种不同的类型可能会使读者感到困惑,并可能导致程序员使用您的类时出现问题。但是,通常情况下,如果你认为你知道自己在做什么,那么C ++就不会妨碍你。

如果您想了解有关比较运算符的更多信息,可能会发现http://en.cppreference.com/w/cpp/language/operator_comparison有趣。