我创建了一个类' myclass '
的双指针对象myclass *obj1,*obj2;
我可以使用比较运算符和指针表达式比较这两个对象,即*obj1==*obj2
如果是,该怎么办?
如果没有,为什么不允许他?
答案 0 :(得分:0)
我可以使用比较运算符和指针表达式比较这两个对象,即
*obj1==*obj2
从整体上讲,只有在为类定义运算符时才能这样做。您可以通过重载operator==
函数来实现,该函数可以是成员函数或非成员函数。
仅当obj1
和obj2
指向有效对象时,它才会在运行时工作。
如果obj1
和obj2
指向有效对象,*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 ==
函数,"计算结果"代码可以是对您的特定类有意义的任何内容,只要它返回true
或false
。
通常,您将比较两个对象的各个成员,如果这些成员保持相同的值,则返回true。但您可能无法比较所有成员。例如,考虑以下Book
类......
class Book
{
public:
std::string Title;
std::string Author;
std::string Isbn;
// ... etc ...
};
如果两个实例具有相同的ISBN值,您可能会认为operator ==
应该返回true,因为 The Hitchhiker的银河系指南这本书的不同版本应该是认为不同。或者,如果两个Book
实例具有相同的Title
和Author
,则可能会认为这两个const MyClass &
实例相同,因为指南的平装版和精装版可能具有不同的ISBN,但它们仍然存在(在某种意义上)同一本书。
最后(!)应该注意,虽然上面的示例代码使用rhs
作为rhs
参数的类型,但C ++不要求lhs
参数是相同的类型作为operator ==
参数。
通常情况下,定义一个{{1}}函数来比较两种不同的类型可能会使读者感到困惑,并可能导致程序员使用您的类时出现问题。但是,通常情况下,如果你认为你知道自己在做什么,那么C ++就不会妨碍你。
如果您想了解有关比较运算符的更多信息,可能会发现http://en.cppreference.com/w/cpp/language/operator_comparison有趣。