Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 超载==&引用;C+中的运算符+;不叫什么?_C++_Operator Overloading - Fatal编程技术网

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
implement
operator==
?(无需在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;
}