2017-02-20 31 views
0

指针表达我创建一个类的两个指针对象对象的比较“MyClass的指针使用CPP

myclass *obj1,*obj2; 

我可以用比较操作符和指针表达这两个对象比较即*obj1==*obj2

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

+0

您的两个指针是指向有效的对象还是未初始化?如果是后者,那么当你试图用*运算符解引用它们时(并且很可能程序崩溃),你将调用未定义的行为。 –

+0

C++不是C,“cpp”不是C语言。 –

回答

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实例将作为参数传递给参数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 ... 
}; 

你可能会决定operator ==应该返回真,只有在两种情况具有相同的ISBN值,因为一本书像漫游指南银河的不同版本应该被认为是不同的。或者,如果两个Book实例具有相同的TitleAuthor,则它们可能会相同,因为本指南的平装本和精装本可能具有不同的ISBN,但它们仍然(某种意义上)是同一本书。

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

通常情况下,它会是当然的,并定义一个函数,比较两种不同类型可能会迷惑读者,并可能导致程序员使用您的类的问题。但是,通常情况下,如果你认为自己知道自己在做什么,C++就不会妨碍你。

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

0

我可以用比较操作符和指针表达这两个比较对象即*obj1==*obj2

Synactically来说,你可以这样做,只有当运营商为该类定义。您可以通过重载operator==函数来实现该功能,该函数可以是成员函数或非成员函数。

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

如果obj1obj2指向有效对象,*obj1 == *obj2将工作就像如果你有

MyClass o1; 
MyClass o2; 

和使用o1 == o2

0

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

0

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

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

您建议的代码只有在myclass定义了operator ==的情况下才有效。正如Jeremy Friesner指出的那样,您需要注意无效指针,特别是值NULL(或nullptr)。

所以,你真正想要的是:如果 ((OBJ1 = nullptr)& &(OBJ 2 = nullptr(& &(* OBJ1 == * OBJ 2))...

我也推荐!将这些标识符改为ptr1和ptr2,因为“obj1”和“obj2”意味着普通读者他们是对象而不是指向对象的指针,或者myclsptr1和myclsptr2,作为向读者指示它们指向什么类型的东西的指示或者,更好的是,在这部分程序中指明他们的目的是什么的名字。

0

1.指派给一个类的指针是类似于指向结构的指针,如果你想比较,你必须访问和比较每个成员。

2。你可以比较obj1 == obj2(它比较地址),但如果你想比较两个对象* obj1 == * obj2你必须在你的“myclass”中超载“==”运算符。 :

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