C++重载operator==比较对象时出现段错误该如何解决?
C++重载operator==实现自定义类相等比较的正确方案
错误原因梳理
- 段错误核心原因:你在
operator==的实现里直接写了*(this) == op1,这相当于直接调用你正在实现的operator==本身,造成无限递归,函数栈溢出后触发段错误。 - 基础语法错误1:
using namespace后面缺少std;,语句不完整。 - 基础语法错误2:
main函数定义缺少大括号包裹函数体,语法非法。 - 类型匹配错误:你尝试修改的
this == op1是拿当前对象的指针和op1对象本身对比,两者类型完全不匹配,自然会触发编译错误。 - 优化缺失点:
operator==的参数建议用const引用,避免不必要的对象拷贝,同时函数本身也声明为const,保证常量对象也能调用该运算符。
正确实现逻辑
相等比较需要手动对比类中所有需要参与相等判断的成员变量即可,你可以根据业务规则决定哪些成员需要参与对比:比如认为书名、价格、页数完全一致才是相等的书,就同时对比三个成员;如果只要求价格和页数相同就算相等,只对比这两个成员即可。
修复后的完整代码
#include <iostream> #include <string> // 使用std::string必须引入对应头文件 using namespace std; class Book{ string title; int price, pages; public: Book(string title = "", int price = 0, int pages = 0){ this->title = title; this->price = price; this->pages = pages; } bool operator==(const Book& op1) const; }; bool Book::operator==(const Book& op1) const { // 此处示例三个成员都参与相等判断,可根据需求调整对比规则 return title == op1.title && price == op1.price && pages == op1.pages; } int main() { Book a("Good C++", 30000, 500), b("Bad C++", 30000, 500); if (a == b) cout << "Same books" << endl; else cout << "Different books" << endl; return 0; }
运行说明
上述代码运行后会输出Different books,因为两个对象的title属性不相等。如果要调整相等判断规则,比如仅要求价格和页数相等就算相同,只要把title == op1.title &&这部分条件删掉即可。
内容的提问来源于stack exchange,提问作者Chung
相关产品推荐
相关产品推荐

