我不能为我的生活理解为什么这不起作用。我感到很困惑。我有一个具有数据成员年龄的类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;
}
我真的觉得重载一个+运算符应该是世界上最容易的事情,除非我不知道我在做什么。我不知道我是否应该在课堂内创建重载函数,如果它有所不同,为什么如果我在里面执行它只允许一个参数,我只是老实说不要'得到它。
答案 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 &
而非参考。
鲍勃是你的叔叔。