指针表达我创建一个类的两个指针对象对象的比较“MyClass的”指针使用CPP
myclass *obj1,*obj2;
我可以用比较操作符和指针表达这两个对象比较即*obj1==*obj2
如果是,它是如何发生的?
如果不是,他为什么不允许他?
指针表达我创建一个类的两个指针对象对象的比较“MyClass的”指针使用CPP
myclass *obj1,*obj2;
我可以用比较操作符和指针表达这两个对象比较即*obj1==*obj2
如果是,它是如何发生的?
如果不是,他为什么不允许他?
如果是的话,它是如何发生的呢? 如果不是,他为什么不允许他?
总之答案是肯定的如果你已经定义了一个适合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 ==
功能,“计算结果”的代码可以绝对任何有意义的特定类,只要它返回true
或false
。
通常,您会比较两个对象的各个成员,并在这些成员保持相同值时返回true。但你可能不会比较全部成员。举个例子,下面Book
类...
class Book
{
public:
std::string Title;
std::string Author;
std::string Isbn;
// ... etc ...
};
你可能会决定operator ==
应该返回真,只有在两种情况具有相同的ISBN值,因为一本书像漫游指南银河的不同版本应该被认为是不同的。或者,如果两个Book
实例具有相同的Title
和Author
,则它们可能会相同,因为本指南的平装本和精装本可能具有不同的ISBN,但它们仍然(某种意义上)是同一本书。
最后(!)应当注意的是,虽然上面的示例代码使用const MyClass &
作为rhs
参数C++不要求该rhs
参数是相同的类型作为参数lhs
的类型。
通常情况下,它会是当然的,并定义一个函数,比较两种不同类型可能会迷惑读者,并可能导致程序员使用您的类的问题。但是,通常情况下,如果你认为自己知道自己在做什么,C++就不会妨碍你。
如果您想了解更多关于比较运算符的信息,您可能会发现http://en.cppreference.com/w/cpp/language/operator_comparison有趣。
我可以用比较操作符和指针表达这两个比较对象即
*obj1==*obj2
Synactically来说,你可以这样做,只有当运营商为该类定义。您可以通过重载operator==
函数来实现该功能,该函数可以是成员函数或非成员函数。
只有当obj1
和obj2
指向有效的对象时它才会在运行时工作。
如果obj1
和obj2
指向有效对象,*obj1 == *obj2
将工作就像如果你有
MyClass o1;
MyClass o2;
和使用o1 == o2
是的,这会工作,但前提是你已经超载了==
操作员为您的班级。如果有,则==
将调用适当的operator==
方法,该方法为您的类实现相等性测试。换句话说,由您来定义什么样的平等对您的班级意味着什么。
==
指针上的运算符会比较它们的数字地址,从而确定*obj1
和* obj2
是否指向同一个对象。
bool operator==(const myclass &obj2); // in this method, see if obj2 is equal to *this.
您建议的代码只有在myclass定义了operator ==的情况下才有效。正如Jeremy Friesner指出的那样,您需要注意无效指针,特别是值NULL(或nullptr)。
所以,你真正想要的是:如果 ((OBJ1 = nullptr)& &(OBJ 2 = nullptr(& &(* OBJ1 == * OBJ 2))...
我也推荐!将这些标识符改为ptr1和ptr2,因为“obj1”和“obj2”意味着普通读者他们是对象而不是指向对象的指针,或者myclsptr1和myclsptr2,作为向读者指示它们指向什么类型的东西的指示或者,更好的是,在这部分程序中指明他们的目的是什么的名字。
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)
您的两个指针是指向有效的对象还是未初始化?如果是后者,那么当你试图用*运算符解引用它们时(并且很可能程序崩溃),你将调用未定义的行为。 –
C++不是C,“cpp”不是C语言。 –