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

Pointer Objects comparison using pointer expression in cpp

本文关键字:指针 表达式 比较 对象 CPP      更新时间:2023-10-16

我创建了一个类的两个指针对象' myClass '

myclass *obj1,*obj2;

我可以使用比较运算符和指针表达式即*obj1==*obj2

比较这两个对象

如果是,它是如何发生的?
如果不是,为什么不允许他?

如果是,它是如何发生的? 如果没有,为什么不允许他?

简而言之,答案将为,如果您定义了合适的operator ==函数用于比较myclass实例,并且 no 如果您尚未定义合适的operator ==函数。p>有两种方式来声明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实例将作为参数传递给参数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,因为像 hitchhiker's Galaxy 的不同版本应视为不同的。另外,您可能会决定,如果两个Book具有相同的TitleAuthor相同,因为该指南的平装本和精装版可能具有不同的ISBN,但在某种意义上(某种意义上说)它们仍然是同一本书。

最后(!)应注意,虽然上面的示例代码使用const MyClass &作为rhs参数C 的类型,并不要求rhs参数与lhs参数相同。

通常是当然是,定义一个比较两种不同类型的operator ==功能可能会使读者感到困惑,并且可能会给使用您的班级的程序员带来问题。但是,通常情况下,如果您认为自己知道自己在做什么,C 就不会妨碍您。

如果您想了解更多有关比较操作员的信息">

是的,这将起作用,但是前提是您将==运算符超载。如果有的话,那么==将调用适当的operator==方法,该方法实现了您的类的相等性测试。换句话说,要定义平等对您的班级意味着什么。

==操作员在指针上将比较其数字地址,因此是否确定*obj1是否确定* obj2指向同一对象。

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

您建议的代码仅在myClass定义操作员==。

时才能起作用。

正如杰里米·弗里斯纳(Jeremy Friesner)指出的那样,您需要提防无效的指针,特别是值null(或nullptr)。

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

我还建议将这些标识符更改为ptr1和ptr2,因为" obj1"answers" obj2"会暗示普通读者是对象而不是对象的指针。或MyClSptr1和MyClSptr2,以表明读者指出了什么样的东西。或者,更好的是,指示其目的在程序的这一部分中是什么名称。

我可以使用比较操作员和指针表达式即*obj1==*obj2

比较这两个对象

从阴道上讲,只有在为类定义操作员时,您才能做到这一点。您可以通过超载operator==函数来执行此操作,该功能可以是成员函数或非成员函数。

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

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

一样工作
MyClass o1;
MyClass o2;

和使用的 o1 == o2

1.类的plointer to类中的指针类似于结构,如果您想比较,则必须访问和比较每个成员。

2.您可以比较 obj1 == obj2 (比较地址),但是如果要比较两个对象*obj1 ==*obj2 您必须超载"==" myClass "中的"操作员

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