重载运算符+ 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++的主要内容,如果未能解决你的问题,请参考以下文章

C++运算符重载

C++:使用类|| 运算符重载友元

c++ 运算符重载问题

C++提高:运算符重载

C++提高:运算符重载

C++语法小记---运算符重载