C/C++ [C++] How Operator Overloading Works

  • Thread starter Thread starter welatiger
  • Start date Start date
  • Tags Tags
    Operator Works
AI Thread Summary
The discussion focuses on understanding operator overloading in C++ through two example programs. The first program correctly implements operator overloading, allowing the addition of CVector objects, while the second program mistakenly adds the same parameter to itself, resulting in incorrect output. The key difference is that the first program uses "this" to refer to the current object's members, while the second program uses the parameter, leading to unexpected results. Additionally, the conversation touches on memory allocation for arrays and pointers, confirming that an array of integers allocates memory based on the size of the integer type and clarifying pointer declarations. Overall, the thread emphasizes the importance of understanding operator overloading and memory management in C++.
welatiger
Messages
85
Reaction score
0
Hi all;

I'm trying to learn about classes and objects, here is a program that demonstrate operator overloading, i cannot understand how it works, when i tried this:

Code:
//classes
#include <iostream>
using namespace std;
class CVector {
      public:
      int x,y;
      CVector(){};
      CVector(int,int);
      CVector operator + (CVector);
};

     CVector::CVector(int a,int b){
             x=a;
             y=b;
             }
     CVector CVector::operator+ (CVector param) {
             CVector temp;
             temp.x=x + param.x;
             temp.y=y + param.y;
             
             return(temp);
             }
int main(){
    CVector a (3,1);
    CVector b (1,2);
    CVector d (6,9);
    CVector c;
    c= a + b + d;
    cout<<c.x<<","<<c.y<<endl;
    system("pause");
    return 0;
}

the output as i expected is 10 and 12.

but when i tried this:

Code:
//classes
#include <iostream>
using namespace std;
class CVector {
      public:
      int x,y;
      CVector(){};
      CVector(int,int);
      CVector operator + (CVector);
};

     CVector::CVector(int a,int b){
             x=a;
             y=b;
             }
     CVector CVector::operator+ (CVector param) {
             CVector temp;
             temp.x=param.x + param.x;
             temp.y=param.y + param.y;
             
             return(temp);
             }
int main(){
    CVector a (3,1);
    CVector b (1,2);
    CVector d (6,9);
    CVector c;
    c= a + b + d;
    cout<<c.x<<","<<c.y<<endl;
    system("pause");
    return 0;
}

the output is 12,18, what is the difference between the two programs?
 
Last edited by a moderator:
Technology news on Phys.org
I suspect you've just made a typo - but let's go through the whole process, in case it's an understanding error.

Operator overloading let's you write methods that get called when you write mathematical operations. This means that if you have a class C, and you define an operator+ method, you can then use the + operator to do maths with instances of class C. If c1 and c2 are instances of class C, you can write:
C c3=c1+c2;
In languages that do not permit operator overloading, you would have to define a method called (for example) add, and use something like:
C c3=c1.add(c2);
The only advantage to operator overloading is that the result is easier to read for a human. In fact, when the compiler sees
C c3=c1+c2;
it knows it should actually do:
C c3=c1.operator+(c2);
So, your line
c=a+b+d;
is equivalent to
c=a.operator+(b).operator+(d);

Can you trace through the two method calls to see what's happening in your modified code?

[Hint: 12=6+6, 18=9+9]
 
The difference is that
Code:
temp.x=param.x + param.x;
temp.y=param.y + param.y;
sets "temp" to "param" + "param".
That's what you got. Your output is twice the value of "d".

The first program means the same as
Code:
temp.x=this.x + param.x;
temp.y=this.y + param.y;
which is what you would expect the "+" operator to mean.
 
Thank You for your reply, it seems very complicated subject, i have two more questions:

(1) when i declare an array like this:
int a[8];
is that mean that the compiler take a space in memory of (4 bytes x 8 =32 bytes), since int is 4 bytes.

(2) is the pointer take a place in memory, i mean is this statements are true:
int *a,*b;
b=&a;

Thank You for Your Concern
 
welatiger said:
(1) when i declare an array like this:
int a[8];
is that mean that the compiler take a space in memory of (4 bytes x 8 =32 bytes), since int is 4 bytes.


Yes, provided an int is 4 bytes. For some compilers, or compiler options, an int could be a different number of bytes.

welatiger said:
(2) is the pointer take a place in memory, i mean is this statements are true:
int *a,*b;
b=&a;
No. You have declared both a and b to be pointers to integers, but in the second line, b would need to be a pointer to a pointer to an integer. You'd have to declare it as

int *a, **b;
b = &a;
 
Thread 'Star maps using Blender'
Blender just recently dropped a new version, 4.5(with 5.0 on the horizon), and within it was a new feature for which I immediately thought of a use for. The new feature was a .csv importer for Geometry nodes. Geometry nodes are a method of modelling that uses a node tree to create 3D models which offers more flexibility than straight modeling does. The .csv importer node allows you to bring in a .csv file and use the data in it to control aspects of your model. So for example, if you...
I tried a web search "the loss of programming ", and found an article saying that all aspects of writing, developing, and testing software programs will one day all be handled through artificial intelligence. One must wonder then, who is responsible. WHO is responsible for any problems, bugs, deficiencies, or whatever malfunctions which the programs make their users endure? Things may work wrong however the "wrong" happens. AI needs to fix the problems for the users. Any way to...
I am trying to run an .ipynb file and have installed Miniconda as well as created an environment as such -conda create -n <env_name> python=3.7 ipykernel jupyter I am assuming this is successful as I can activate this environment via the anaconda prompt and following command -conda activate <env_name> Then I downloaded and installed VS code and I am trying to edit an .ipynb file. I want to select a kernel, via VS Code but when I press the button on the upper right corner I am greeted...

Similar threads

Replies
23
Views
3K
Replies
5
Views
3K
Replies
22
Views
3K
Replies
52
Views
4K
Replies
25
Views
2K
Replies
1
Views
8K
Replies
89
Views
6K
Replies
6
Views
1K
Back
Top