重载运算符+ C++
Posted
技术标签:
【中文标题】重载运算符+ C++【英文标题】:Overloading operator+ C++ 【发布时间】:2016-09-12 04:28:45 【问题描述】:我看到了多个关于如何添加同一类的两个变量的示例,但我找不到关于如何通过重载添加不同类的变量的示例。
如果它与我的问题相关,我们还没有使用模板,但我假设我们不允许使用它。
我想使用 + 运算符将课程书添加到班级人员。 前任。人 p; b书; p+b;//添加一本书,就像它使用像 p.addBook(b) 这样的函数一样;
class Person
private:
B * b;
string sName;
int numOfBook;
int maxNumOfBooks;
maxNumOfBooks 是允许携带的最大值
public:
Person();
Person(const Person&);
~Person();
const Person operator = (const Person &)
void addBook(const Book &); //adds a book to a Person
Person operator+(Person );
Book getBook()return b[numOfBook];//returns index of book
;
Person::Person()
numOfBook = 0;
maxNumOfBooks = 10;
b = new B[maxNumOfBooks];
for(int x=0;x<maxNumOfBooks;x++)
将名称设置为“”。我确实超载了这个。
b[x] = "";
Person::Person(const Person& p)
numOfBook = p.numOfBook;
maxNumOfBooks = p.maxNumOfBooks;
b = new B[maxNumOfBooks];
for(int x=0;x<maxNumOfBooks;x++)
b[x] = p.b[x];
Person::~Person()
delete [] b;
void Person::addBook()
如果 numOfBooks
是否编写了此代码。
Person Person::operator+(Person obj)
不完全确定在这里做什么。但我假设它必须看起来像这样。
Spell a;
++numOfBook;
a=this->getBook(numOfBook);
obj.addBook(a);
return *this;
const Person Person::operator = (const Person & obj)
delete [] b;
numOfBook = p.numOfBook;
maxNumOfBooks = p.maxNumOfBooks;
b = new B[maxNumOfBooks];
for(int x=0;x<maxNumOfBooks;x++)
b[x] = p.b[x];
return *this;
class Book
private:
string name;
int price;
public:
void setP();
int getP();
;
int main()
Person s;
Book bk("Story", 18);
s+bk;
我想在 Person 中添加一本书,但它也应该使用 addBook() 函数。
【问题讨论】:
您正在按值返回Person
对象。那么Person
对象的赋值运算符和复制构造函数在哪里?这两个功能是您的operator +
正常工作所必需的,而您完全错过了编写它们。请阅读rule of 3
@PaulMcKenzie,如果我的问题需要,我可以添加它。它在我的原始代码中。
所以您决定稍后添加对您的operator +
正常工作至关重要的功能?这些功能应该在您的原始帖子中,而不是事后才想到。
@PaulMcKenzie 我添加了缺少的代码。
operator +
应该返回一个全新的 Person
对象,而不是对原始对象的引用。 operator +=
将返回对原始对象的引用。此外,您的赋值运算符存在缺陷,因为它不检查自赋值(除了其他缺陷)。
【参考方案1】:
当您重载+
运算符时,您会返回一个新的返回类型实例(这对于两个输入和输出是相同类型的算术类型通常是重载的,但这完全没有必要)。
您只需要弄清楚操作员应该做什么。
在这种情况下,+
运算符应将一本书添加到调用的人员对象的副本中(即返回一个新实例而不修改原始实例)。
Person Person::operator + (const Book& b)
Person tmp(*this); //create a copy of this Person to modify
tmp.addBook(b); //modify this new copy and not the original
return tmp; //return the modified copy
而+=
运算符将修改当前对象并返回一个引用
Person& Person::operator += (const Book& b)
addBook(b);
return *this;
如果您已经定义了+=
,您可以将+
运算符更改为:
Person Person::operator + (const Book& b)
return Person(*this) += b;
注意:
Person P;
Book B;
P + B; // P is not modified;
不等同于:
Person P;
Book B;
P.addBook(B); // P is modified
但是下面是。
Person P;
Book B;
P += B; // P is modified
还有
Person P;
Book B;
P = P + B; // P is modified because it is assigned (P + B)
【讨论】:
另外,一旦operator +=
就位,operator +
就是return Person(*this) += b;
@PaulMcKenzie,好点。
@Timothy Murphy,谢谢你,我会看看它并开始编码。我也很抱歉没有添加必要的代码,因为我没有想到。我发布得太快了,没有确保我添加了所有必要的代码。
@ArcheAngel 如果您认为我的回答完全解决了您的问题,您应该接受它。如果没有,请告诉我您仍然遇到什么问题,以便我或其他人可以帮助您解决。以上是关于重载运算符+ C++的主要内容,如果未能解决你的问题,请参考以下文章