Connecting Tech Pros Worldwide Help | Site Map

C++ Primer (4th Ed.) - lvalue op= expr

  #1  
Old December 21st, 2007, 11:05 AM
subramanian100in@yahoo.com, India
Guest
 
Posts: n/a
In C++ Primer(4th Edition) by Stanley Lippman, in page 162, the
following is mentioned:

The general syntactic form of a compound assignment operator is

a op= b

where op= may be one of the following ten operators:
+= -= *= /= %= // arithmetic operators
<<= >>= &= ^= != // bitwise operators


In page 512 in this book, in the chapter 14 on Overloaded Operations
and Conversions, the following is mentioned:

Like assignment, the compound-assignment operators ordinarily ought to
be members of the class. Unlike assignment, they are not required to
be so and the compiler will not complain if a non-member compound-
assignment operator is defined.

I tried the following sample program:

#include <iostream>
#include <cstdlib>

using namespace std;

class Test
{
public:
Test(int arg = 10);
int val;
};

Test::Test(int arg) : val(arg)
{
cout << "one arg ctor called" << endl;
}

Test operator+=(Test lhs, Test rhs)
{
cout << "from operator+=" << endl;
return Test(lhs.val + rhs.val);
}

int main()
{
Test obj;

5 += obj;

return EXIT_SUCCESS;
}

This program compiles fine with both g++ and VC++ 2005 Express Edition
and both produced the following output:

one arg ctor called
one arg ctor called
from operator+=
one arg ctor called

My question:
Why doesn't the standard make the '+=', '-=', etc. be defined only as
non-static member functions similar to the way that an 'operator=,
operator[], operator(), and operator->' must be non-static member
function, so that it will disallow 5 += obj;

Is there any advantage for the compound-assignment operators(as per
the definition given in the beginning above) be allowed as non-member
functions ?

Kindly clarify

Thanks
V.Subramanian
  #2  
Old December 22nd, 2007, 01:45 PM
=?UTF-8?B?RXJpayBXaWtzdHLDtm0=?=
Guest
 
Posts: n/a

re: C++ Primer (4th Ed.) - lvalue op= expr


On 2007-12-21 12:03, subramanian100in@yahoo.com, India wrote:
Quote:
In C++ Primer(4th Edition) by Stanley Lippman, in page 162, the
following is mentioned:
>
The general syntactic form of a compound assignment operator is
>
a op= b
>
where op= may be one of the following ten operators:
+= -= *= /= %= // arithmetic operators
<<= >>= &= ^= != // bitwise operators
>
>
In page 512 in this book, in the chapter 14 on Overloaded Operations
and Conversions, the following is mentioned:
>
Like assignment, the compound-assignment operators ordinarily ought to
be members of the class. Unlike assignment, they are not required to
be so and the compiler will not complain if a non-member compound-
assignment operator is defined.
>
I tried the following sample program:
>
#include <iostream>
#include <cstdlib>
>
using namespace std;
>
class Test
{
public:
Test(int arg = 10);
int val;
};
>
Test::Test(int arg) : val(arg)
{
cout << "one arg ctor called" << endl;
}
>
Test operator+=(Test lhs, Test rhs)
{
cout << "from operator+=" << endl;
return Test(lhs.val + rhs.val);
}
>
int main()
{
Test obj;
>
5 += obj;
>
return EXIT_SUCCESS;
}
>
This program compiles fine with both g++ and VC++ 2005 Express Edition
and both produced the following output:
>
one arg ctor called
one arg ctor called
from operator+=
one arg ctor called
>
My question:
Why doesn't the standard make the '+=', '-=', etc. be defined only as
non-static member functions similar to the way that an 'operator=,
operator[], operator(), and operator->' must be non-static member
function, so that it will disallow 5 += obj;
>
Is there any advantage for the compound-assignment operators(as per
the definition given in the beginning above) be allowed as non-member
functions ?
Yes, by allowing the compound assignment operators to be non-members the
standard allows usages such as 5 += obj. If you can not come up with a
good reason why it should not be allowed then it probably should be
allowed, just because you (and probably almost everyone else) might not
see any good uses for it does not mean that there are none.

--
Erik Wikström
  #3  
Old December 24th, 2007, 05:35 PM
Andrew Koenig
Guest
 
Posts: n/a

re: C++ Primer (4th Ed.) - lvalue op= expr


<subramanian100in@yahoo.comwrote in message
news:5ddc424f-04d9-41be-948e-59180ea8f094@e10g2000prf.googlegroups.com...
Quote:
Why doesn't the standard make the '+=', '-=', etc. be defined only as
non-static member functions similar to the way that an 'operator=,
operator[], operator(), and operator->' must be non-static member
function, so that it will disallow 5 += obj;
Because there's no need.

Plain assignment has to be a member because the compiler generates it if you
don't define it; and unless it's a member, there is no reliable way for the
compiler to know that you didn't define it. +=, etc. are never generated
automatically, so the compiler doesn't care what you do with them.


Closed Thread