指针对象使用CPP中的指针表达式进行比较
Pointer Objects comparison using pointer expression in cpp
我创建了一个类的两个指针对象' 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 ==
函数,"计算结果"代码绝对对于您的特定类都有意义,只要它返回true
或false
。
通常,您会比较两个对象的各个成员,如果这些成员保持相同的值,则返回true。但是您可能无法比较所有成员。例如,考虑以下Book
类...
class Book
{
public:
std::string Title;
std::string Author;
std::string Isbn;
// ... etc ...
};
您可能会决定,只有在两个实例具有同等的ISBN值时,operator ==
才能返回true,因为像 hitchhiker's Galaxy 的不同版本应视为不同的。另外,您可能会决定,如果两个Book
具有相同的Title
和Author
相同,因为该指南的平装本和精装版可能具有不同的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==
函数来执行此操作,该功能可以是成员函数或非成员函数。
仅当obj1
和obj2
指向有效对象时,它才能在运行时间工作。
如果obj1
和obj2
指向有效对象,则*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)
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 如何使用条件表达式返回对象指针?
- 无法在 clang 中dyn_cast指向 DeclRefExpr 的表达式指针
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 如何从 lambda 表达式中获取函数指针?
- 运行时错误:基0x000000000000溢出到0xffffffffffffffff的指针索引表达式 (basic_st
- 使用makeword函数创建错误e0109-表观呼叫的括号前表达式必须具有(指针到 - )函数类型
- 表达式必须具有指向对象的指针类型(指针向量)
- 尝试使用指针时出现预期表达式"this"错误
- 表达式必须在C 中具有指针对象类型
- 函数指针表达式
- 指针对象使用CPP中的指针表达式进行比较
- 正则表达式 & 无效的空指针表达式
- 使用指针表达式 必须具有类类型错误 c++
- 复杂的指针表达式
- C++指针表达式和数组
- 在类方法上使用指针:表达式的类型必须为bool错误