开发者

operator overloading in c++ - A query

开发者 https://www.devze.com 2023-03-01 14:34 出处:网络
I was reading a book on operator overloading in c++ and I encountered the following code: class Array {

I was reading a book on operator overloading in c++ and I encountered the following code:

class Array {   
    ...
    public:        
    Array & operator << ( int x) {
          // insert x at the end of the array  
    }  
};  

Next It says: that overloading of the form a << x << y << z ; wll not work

So It suggests that second invocation is treated as :

( (a << x)<< y ) << z .so it recommends using return *this;

But I am not getting how return *this functions here? Please help!

Here is the entire code:

#include <iostream>
#include <cstdlib>
using namespace std;

class Array {

 int *a;
 int capacity;
 int size;
 int incr;

 public:
    Array (int c=10) { 
        a = new int[c]; 
        capacity = c;
        for (int i=0; i<c; i++) a[i]=0;
        size=0;
        incr = c;
    }
    Array  &operator << (int x) { 
        if(size<capacity) a[size++] = x;
        else {
            int *tmp = new int [capacity+incr];
            for (int i=0; i<size; i++) tmp[i]=a[i];
            delete[] a;
            a = tmp;
            a[size++]=x;
            capacity = capacity+incr;
        }
        return *this;

     };
    int operator [] (int i) { 
        if(i<size) return a[i];
    };


};



int main (int argc, char *argv[]) {

 int s = atoi (argv[1]);
 Array 开发者_StackOverflow社区A (s);
 for (int i=0; i<s; i++) A << i << i+1; 
 for (int i=0; i<s; i++) cout << A[i] << endl; 


}


This really has nothing to do with operator overloading. It's called chaining and it's easier to explain using regular member functions. Suppose you defined a member function called insert like this:

Array& insert(int x) {
    // insert x at the end of the array
    return *this;
}

The return *this will return a reference to the current object so that you can chain calls like this:

Array a;
a.insert(0).insert(1).insert(2);

Which is essentially equivalent to:

Array a;
a.insert(0);
a.insert(1);
a.insert(2);

Each call to insert() will return a reference to the original object, allowing other calls to be made using that returned reference. You can overload the << operator to do the same thing:

Array& operator<<(int x) {
    // insert x at the end of the array
    return *this;
}

Now you can chain calls like this:

Array a;
a << 0 << 1 << 2;


You may be getting confused because of the spacing of Array &operator <<. The return value of the function is Array&, a reference to the array object.

Here's an example. In your call A << i << i+1, the A << i is called first and a reference to the updated A is returned. Next A << i+1 is called, with that new reference.


Yes everything is ok with your code. operator << in your semantics will and returning refference to same object which called it. You can see same in code of operator << of std::ostream and operator >> of std::istream.

0

精彩评论

暂无评论...
验证码 换一张
取 消