943,692 Members | Top Members by Rank

Ad:
  • C++ Discussion Thread
  • Unsolved
  • Views: 21637
  • C++ RSS
Mar 18th, 2006
0

Overloading assignment operator

Expand Post »
Why cant we overload assignment operator using a friend function?
Please help??
Thanks,
comwizz.
Similar Threads
Reputation Points: 10
Solved Threads: 0
Light Poster
comwizz is offline Offline
39 posts
since Nov 2005
Mar 18th, 2006
0

Re: Overloading assignment operator

Quote originally posted by comwizz ...
Why cant we overload assignment operator using a friend function?
operator= can only be a member function. It is intimately connected to the object on the left side of the =.

If it was possible to define operator= globally, then you might attempt to redefine the built-in = sign
C++ Syntax (Toggle Plain Text)
  1. int operator=(int, userdefinedtype);
This is the reason due to which you are forced to use operator= as member function.
SpS
Reputation Points: 70
Solved Threads: 32
Posting Pro
SpS is offline Offline
598 posts
since Aug 2005
Mar 18th, 2006
0

Re: Overloading assignment operator

Quote originally posted by sunnypalsingh ...
It is intimately connected to the object on the left side of the =
I dont understand this clearly.

Quote ...
If it was possible to define operator= globally, then you might attempt to redefine the built-in = sign
C++ Syntax (Toggle Plain Text)
  1. int operator=(int, userdefinedtype);
I cannot understand this fully , how would globally defining = operator make a difference??
Thanks for your help,
comwizz
Reputation Points: 10
Solved Threads: 0
Light Poster
comwizz is offline Offline
39 posts
since Nov 2005
Mar 18th, 2006
0

Re: Overloading assignment operator

>operator= can only be a member function.
Correct.

>It is intimately connected to the object on the left side of the =.
Yes, but not so intimately (ie. constructor or destructor) that a non-member function is completely illogical. You could, if C++ allowed it, do this, and nobody would question how reasonable it is:
C++ Syntax (Toggle Plain Text)
  1. class C {
  2. friend void operator= ( C& lhs, const C& rhs );
  3. };
  4.  
  5. void operator= ( C& lhs, const C& rhs )
  6. {
  7. // Assign rhs to lhs
  8. }
>If it was possible to define operator= globally, then you might attempt to redefine the built-in = sign
That's a different issue entirely. It's trivial for an implementation to allow a non-member operator= but disallow defining it on built-in types. The reason operator= is required to be a member is because operator= has default behavior. If you redefine it globally, there's a distinct threat of a = b meaning different things to different parts of the code. Consider this:
C++ Syntax (Toggle Plain Text)
  1. struct C {
  2. // Default operator= (shallow copy)
  3. char *p;
  4. };
  5.  
  6. void foo ( C& c )
  7. {
  8. C scratch;
  9.  
  10. // Work with scratch
  11.  
  12. c = scratch;
  13. }
  14.  
  15. void operator= ( C& lhs, const C& rhs )
  16. {
  17. // Assign rhs to lhs (deep copy)
  18. }
  19.  
  20. void bar ( C& c )
  21. {
  22. C scratch;
  23.  
  24. // Work with scratch
  25.  
  26. c = scratch;
  27. }
  28.  
  29. int main()
  30. {
  31. C test;
  32.  
  33. foo ( test );
  34. bar ( test );
  35. }
foo doesn't know that operator= was redefined because function declarations are positional. If you declare an overload after you use the function, the overload isn't recognized. So foo will use the default operator=, which performs a shallow copy and ends up aliasing the pointer in c with the transient pointer in scratch that will get destroyed when foo returns. Therefore you have a memory leak, data loss, *and* an unexpected pointer to freed memory, whereas bar has none of these problems because it uses the overloaded operator= and correctly performs a deep copy.
Administrator
Reputation Points: 6442
Solved Threads: 1393
Bad Cop
Narue is offline Offline
11,807 posts
since Sep 2004
Mar 18th, 2006
0

Re: Overloading assignment operator

Quote ...
foo doesn't know that operator= was redefined because function declarations are positional. If you declare an overload after you use the function, the overload isn't recognized. So foo will use the default operator=, which performs a shallow copy and ends up aliasing the pointer in c with the transient pointer in scratch that will get destroyed when foo returns. Therefore you have a memory leak, data loss, *and* an unexpected pointer to freed memory, whereas bar has none of these problems because it uses the overloaded operator= and correctly performs a deep copy.
According to your code the assignment operator could be used as a friend function to class c and the bar function would work correctly as deep copy is implemented . So why not use the assignment operator overloading as a friend function by declaring and defining it above other functions and hence default = operator performing shallow copy would not be called??
Thanks for your help,
comwizz
Reputation Points: 10
Solved Threads: 0
Light Poster
comwizz is offline Offline
39 posts
since Nov 2005
Mar 18th, 2006
0

Re: Overloading assignment operator

>So why not use the assignment operator overloading as a friend function
>by declaring and defining it above other functions
Indeed, why not? Just make sure that you get it right for any possible combination of functions and declarations in any number and combination of source files. And also keep a sticky note on your monitor to remind you of such a subtle problem that not even lint can warn you about. Also, don't forget that you need to watch for it in other people's code and any code you maintain, for a seemingly innocent change could introduce serious and difficult to find bugs.

The point is that it's very difficult to error check this problem in any non-trivial project. It's also so subtle that even programmers who are aware of it will be hard pressed to avoid it, much less the more numerous programmers who wouldn't even know the problem exists until it bites them in the ass. Compare that to the current state of affairs where a simple rule avoids the problem entirely, and the simple rule can't be missed because it gives you a compile time error if you don't follow it.

A guiding rule in the design of C++ is that a compile time error is much more desirable than a runtime error.
Administrator
Reputation Points: 6442
Solved Threads: 1393
Bad Cop
Narue is offline Offline
11,807 posts
since Sep 2004
Mar 19th, 2006
0

Re: Overloading assignment operator

Thanks Narue.

Your posts are always eye openers.
SpS
Reputation Points: 70
Solved Threads: 32
Posting Pro
SpS is offline Offline
598 posts
since Aug 2005

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in C++ Forum Timeline: error C2064: term does not evaluate to a function taking 1 arguments
Next Thread in C++ Forum Timeline: C++ For Loop Question





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC