C++ 超载==&引用;C+中的运算符+;不叫什么?
我有一个任务类,它有一个C++ 超载==&引用;C+中的运算符+;不叫什么?,c++,operator-overloading,C++,Operator Overloading,我有一个任务类,它有一个字符串文本私有成员。我通过conststring getText()const访问变量 我想重载==操作符来检查对象的不同实例是否具有相同的文本 我已经声明了一个公共bool操作符==(const Task text2)const并按如下方式编写代码: bool Task::operator==( const Task text2 ) const { return strcmp( text.c_str(), text2.getText().c_str() ) =
字符串文本
私有成员。我通过conststring getText()const访问变量代码>
我想重载==
操作符来检查对象的不同实例是否具有相同的文本
我已经声明了一个公共bool操作符==(const Task text2)const在类标题上编写>并按如下方式编写代码:
bool Task::operator==( const Task text2 ) const {
return strcmp( text.c_str(), text2.getText().c_str() ) == 0;
}
但它总是返回false,即使在字符串相等的情况下也是如此
因此,我在bool操作符==(const Task text2)const中添加了一个cout调用
检查是否正在调用它,但未得到任何结果
似乎从未调用我的自定义==
运算符
我的标题:
#ifndef TASK_H
#define TASK_H
#include <iostream>
using namespace std;
class Task {
public:
enum Status { COMPLETED, PENDIENT };
Task(string text);
~Task();
// SETTERS
void setText(string text);
void setStatus(Status status);
// GETTERS
const string getText() const;
const bool getStatus() const;
const int getID() const;
const int getCount() const;
// UTILS
//serialize
const void printFormatted() const;
// OVERLOAD
// = expression comparing text
bool operator==( const Task &text2 ) const;
private:
void setID();
static int count;
int id;
string text;
Status status;
};
#endif
主文件:
using namespace std;
int main() {
Task *t = new Task("Second task");
Task *t2 = new Task("Second task");
cout << "Total: " << t->getCount() << endl;
t->printFormatted();
t2->printFormatted();
if( t == t2 ) {
cout << "EQUAL" << endl;
}
else {
cout << "DIFF" << endl;
}
return 0;
}
使用名称空间std;
int main(){
任务*t=新任务(“第二个任务”);
任务*t2=新任务(“第二个任务”);
cout printFormatted();
如果(t==t2){
无法尝试将方法签名更改为:
bool Task::operator==(const Task &text2) const;
(即,尝试使用text2
参数的引用)。如果getText
访问器是公共的,则无需将其定义为成员函数,并且绝对无需在任何地方、任何时候使用strcmp
bool operator==(const Task& lhs, const Task& rhs) {
return lhs.getText() == rhs.getText();
}
您正在比较指针…请尝试*t==*t2
您不是在比较任务,而是在比较指针与任务。t==t2
并不意味着*t==t2
。您不能为内置类型重载=
运算符。您是在比较指针,而不是指向对象
使用if(*t==*t2)
或者您只需检查地址是否相同,这显然总是错误的
Task *t = new Task("Second task");
Task *t2 = new Task("Second task");
// ...
if( t == t2 ) {
您不是在比较任务
对象,而是指向任务
对象的指针。指针比较是该语言固有的,并比较对象的标识(即,仅当两个指针指向同一对象或两者均为空时,才会产生真
)
如果要比较需要取消引用指针的对象,请执行以下操作:
if( *t == *t2 ) {
你写道:
作为C/C++的初学者,我有时会对指针和引用感到困惑
这个问题的解决方法很简单:<强>不要使用指针。> C,C++允许你在不直接使用指针的情况下编写完全有用的程序。
以下是您编写程序的方法:
int main() {
Task t("Second task");
Task t2("Second task");
std::cout << "Total: " << t.getCount() << "\n";
t.printFormatted();
t2.printFormatted();
if( t == t2 ) {
std::cout << "EQUAL\n";
}
else {
std::cout << "DIFF\n";
}
return 0;
}
intmain(){
任务t(“第二个任务”);
任务t2(“第二个任务”);
std::cout正要提到这一点。顺便说一句,重载准则也提到了这一点:@JuanCruzViotti有了这个更改,您的操作符被调用了吗?@JuanCruzViotti您正在比较指针。修复您的代码以比较*t==*t2
,您将看到它将被调用。@bitmask:这将允许什么优化?@bitmask:如果函数按值获取,并且它接收到一个r值,那么副本将被省略,当然。但是如果它接收到一个l值,那么肯定会有一个副本。但是,如果函数采用引用,则在任何情况下都不会有副本。当您仍然需要副本时,或者当您的对象是轻量级的时,按值接受都很有用。这是nction不需要任何副本,而且这些对象看起来不是很轻。您可以将代码发布到调用比较运算符的位置吗?另外,您是否知道std::string
implementoperator==
?(无需在C字符串上调用strcmp
)请添加一个再现问题的最小示例。我目前正在阅读的书建议使用运算符重载方法作为成员函数,对于速度而言没有任何区别。自由函数在其他方面也远远优于其他函数。如果它推荐您正在编写的代码,您需要找到一本新书。谢谢!作为开始在C/C++中,我有时会被指针和引用弄糊涂。)我很感激这种建议。你能给我推荐一些C++代码标准的书或指南吗?
int main() {
Task t("Second task");
Task t2("Second task");
std::cout << "Total: " << t.getCount() << "\n";
t.printFormatted();
t2.printFormatted();
if( t == t2 ) {
std::cout << "EQUAL\n";
}
else {
std::cout << "DIFF\n";
}
return 0;
}