试图重载+运算符

时间:2013-10-25 02:08:28

标签: c++

我不能为我的生活理解为什么这不起作用。我感到很困惑。我有一个具有数据成员年龄的类Person,我只想添加两个人,以便添加年龄。我不知道为什么这么难,但我正在寻找例子,我觉得每个人都做了不同的事情,并且由于某种原因,他们没有工作。有时我看到的示例有两个参数,有时它们只有一个,有时参数是对象的引用,有时它们不是,有时它们返回一个int,有时它们返回一个Person对象。喜欢......最正常的做法是什么?

class Person {
    public: 
        int age;
        //std::string haircolor = "brown";
        //std::string ID = "23432598";

        Person(): age(19) {}

        Person operator+(Person&) { }
};

Person operator+(Person &obj1, Person &obj2){
    Person sum = obj1;
    sum += obj2;
    return sum;
}

我真的觉得重载一个+运算符应该是世界上最容易的事情,除非我不知道我在做什么。我不知道我是否应该在课堂内创建重载函数,如果它有所不同,为什么如果我在里面执行它只允许一个参数,我只是老实说不要'得到它。

3 个答案:

答案 0 :(得分:1)

试试这个:

class Person {
public: 
    int age;
//std::string haircolor = "brown";
//std::string ID = "23432598";

    Person(): age(19) {}

    Person operator+ (const Person&); // Skip the definition for later.
};

Person Person::operator+ (const Person& other) { // Declare as member of Person::
    Person sum;
    sum.age = this->age + other.age; // All member functions have pointer: this.
    return sum;
}

或者让运营商成为非会员:

Person operator+ (const Person& p1, const Person& p2) { // Non-member don't have pointer: this
    Person sum;
    sum.age = p1.age + p2.age;
    return sum;
}

操作员重载可以是成员也可以是非成员,这是您的选择。有关在成员和非成员运算符重载之间进行选择的指南的更多信息,请this link

注意:通常的做法是将类的成员变量声明为private,以便不公开实现。但是,这将导致非成员运算符重载,无法再访问Person对象的成员age。解决方案(和常见做法)是将非成员运算符函数作为friend添加到Person。然后,非成员函数将可以访问私有成员age

class Person {
friend Person operator+ (const Person&, const Person&);
private: 
    int age;
    // ...
public:
    // ...
}

答案 1 :(得分:0)

看起来你正试图同时做两个操作符重载方法,而你只需要做一个。

要修复代码,请从人员定义中删除Person operator+(Person&) { }

区别在于一个是成员,一个是自由功能。两者都有优点,在某些情况下必须使用其中一种。特别是该成员可以在不被声明为朋友的情况下访问私有成员,并且operator()需要是成员。有些运算符最好是作为自由函数实现的,例如你想要将int等基本类型与你的类结合起来。

在这种情况下,一方面没有任何特别的优势。

答案 2 :(得分:0)

Person中,实施Person& operator+=(Person const& other),增加另一个Person

将免费operator+的签名更改为Person const &而非参考。

鲍勃是你的叔叔。