Why can't '='(Assignment) operator be overloaded as friend function ?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Nitin Bhardwaj

    Why can't '='(Assignment) operator be overloaded as friend function ?

    Thanx in advance for the response...

    I wanna enquire ( as it is asked many a times in Interviews that i
    face as an Engg PostGraduate ) about the overloading capability of the
    C++ Language.

    Why can't the = (assignment) operator be overloaded as a friend
    function ?
    I work in VS 6.0 ( Win2000 ) as when i referred the MSDN documen'n it
    said the following :

    The operators [] , -> , = cannot be overloaded as static functions

    from which i figured out that since 'friend' qualifier makes the
    function a static function( i.e. a per-class member ), hence =
    operator can't be overloaded as a friend function.But why is such
    restrction there in the language in the first place ???
  • Jan Rendek

    #2
    Re: Why can't '='(Assignment) operator be overloaded as friend function?

    > 1) If you do not define an assignment operator in your class[color=blue]
    > the compiler will create a default one for you.[/color]

    Sorry I did not finish that one:
    The created default operator definition
    will result in an ambigous call whenever
    you'll use the assignment

    ex:
    class A {

    public:
    A(int i) : _i(i) {}

    friend A& operator=(A& lhs, const A& rhs);

    private:
    int i;
    };


    A& operator=(A& lhs, const A& rhs) {
    lhs._i = rhs._i;
    }

    int main() {
    A a(0), b(10);

    a = b;
    }
    leads to the following error msg: (GCC 3.2, Linux Mandrake 9.0, Intel
    Pentium):

    See the *** line

    launcher.C:11: `A& operator=(A&, const A&)' must be a nonstatic member
    function
    launcher.C:18: `A& operator=(A&, const A&)' must be a nonstatic member
    function

    launcher.C: In function `int main()':
    launcher.C:25: ambiguous overload for `A& = A&' operator ***
    launcher.C:6: candidates are: A& A::operator=(co nst A&)
    launcher.C:18: A& operator=(A&, const A&)
    launcher.C:18: A& operator=(A&, const A&)


    --
    Jan Rendek
    INRIA, Lorraine
    r e n d e k @ l o r i a . f r

    Comment

    • John Harrison

      #3
      Re: Why can't '='(Assignment) operator be overloaded as friend function ?


      "Nitin Bhardwaj" <nitinbhardwaj8 0@hotmail.com> wrote in message
      news:17fa8780.0 307110108.69e85 392@posting.goo gle.com...[color=blue]
      > Thanx in advance for the response...
      >
      > I wanna enquire ( as it is asked many a times in Interviews that i
      > face as an Engg PostGraduate ) about the overloading capability of the
      > C++ Language.
      >
      > Why can't the = (assignment) operator be overloaded as a friend
      > function ?
      > I work in VS 6.0 ( Win2000 ) as when i referred the MSDN documen'n it
      > said the following :
      >
      > The operators [] , -> , = cannot be overloaded as static functions
      >
      > from which i figured out that since 'friend' qualifier makes the
      > function a static function( i.e. a per-class member ), hence =
      > operator can't be overloaded as a friend function.But why is such
      > restrction there in the language in the first place ???[/color]

      Different rules apply to the functions which are called because they are
      member functions or friend functions. For instance

      class X // uses friend
      {
      public:
      X(int); // note we can make an X from an int
      friend bool operator<(const X&, const X&);
      };

      Given the above

      X x;
      if (1 < x)
      ...

      is legal. The compiler will automatically construct an X object from the int
      1. But given


      class Y // uses member
      {
      public:
      Y(int); // note we can make an Y from an int
      bool operator<(const Y&) const;
      };

      then

      Y y;
      if (1 < y)
      ...

      is not legal. With a member function you do not get the automatic conversion
      of the first argument, the compiler will not construct a Y object from an
      int in the expression 1 < y.

      You can probably guess what is coming now. If you were able to declare
      operator= as a friend like this

      class X // uses friend
      {
      public:
      X(int); // note we can make an X from an int
      X& operator=(X&, const X&);
      };

      then stupid code like this

      X x;
      1 = x;

      would be legal!

      In short requiring that operator= be a member function ensures that what you
      are assigning to really is a bona fide object, not some temporary
      constructed by the compiler.

      john


      Comment

      • John Harrison

        #4
        Re: Why can't '='(Assignment) operator be overloaded as friend function ?

        >[color=blue]
        > You can probably guess what is coming now. If you were able to declare
        > operator= as a friend like this
        >
        > class X // uses friend
        > {
        > public:
        > X(int); // note we can make an X from an int
        > X& operator=(X&, const X&);
        > };
        >[/color]

        Of course I meant

        friend X& operator=(X&, const X&);

        john


        Comment

        • Ron Natalie

          #5
          Re: Why can't '='(Assignment) operator be overloaded as friend function ?


          "Nitin Bhardwaj" <nitinbhardwaj8 0@hotmail.com> wrote in message news:17fa8780.0 307110108.69e85 392@posting.goo gle.com...
          [color=blue]
          > Why can't the = (assignment) operator be overloaded as a friend
          > function ?[/color]

          The copy assignment operator is generated by the compiler if you don't define
          one for a class. If you try to implement it as a non-member function, it doesn't
          supress the generated one.


          Comment

          • Stuart Golodetz

            #6
            Re: Why can't '='(Assignment) operator be overloaded as friend function ?

            John Harrison <john_andronicu s@hotmail.com> wrote in message
            news:bemegb$6mu 7d$1@ID-196037.news.uni-berlin.de...[color=blue]
            >
            > "Nitin Bhardwaj" <nitinbhardwaj8 0@hotmail.com> wrote in message
            > news:17fa8780.0 307110108.69e85 392@posting.goo gle.com...[color=green]
            > > Thanx in advance for the response...
            > >
            > > I wanna enquire ( as it is asked many a times in Interviews that i
            > > face as an Engg PostGraduate ) about the overloading capability of the
            > > C++ Language.
            > >
            > > Why can't the = (assignment) operator be overloaded as a friend
            > > function ?
            > > I work in VS 6.0 ( Win2000 ) as when i referred the MSDN documen'n it
            > > said the following :
            > >
            > > The operators [] , -> , = cannot be overloaded as static functions
            > >
            > > from which i figured out that since 'friend' qualifier makes the
            > > function a static function( i.e. a per-class member ), hence =
            > > operator can't be overloaded as a friend function.But why is such
            > > restrction there in the language in the first place ???[/color]
            >
            > Different rules apply to the functions which are called because they are
            > member functions or friend functions. For instance
            >
            > class X // uses friend
            > {
            > public:
            > X(int); // note we can make an X from an int
            > friend bool operator<(const X&, const X&);
            > };
            >
            > Given the above
            >
            > X x;
            > if (1 < x)
            > ...
            >
            > is legal. The compiler will automatically construct an X object from the[/color]
            int[color=blue]
            > 1. But given
            >
            >
            > class Y // uses member
            > {
            > public:
            > Y(int); // note we can make an Y from an int
            > bool operator<(const Y&) const;
            > };
            >
            > then
            >
            > Y y;
            > if (1 < y)
            > ...
            >
            > is not legal. With a member function you do not get the automatic[/color]
            conversion[color=blue]
            > of the first argument, the compiler will not construct a Y object from an
            > int in the expression 1 < y.
            >
            > You can probably guess what is coming now. If you were able to declare
            > operator= as a friend like this
            >
            > class X // uses friend
            > {
            > public:
            > X(int); // note we can make an X from an int
            > X& operator=(X&, const X&);
            > };
            >
            > then stupid code like this
            >
            > X x;
            > 1 = x;
            >
            > would be legal!
            >
            > In short requiring that operator= be a member function ensures that what[/color]
            you[color=blue]
            > are assigning to really is a bona fide object, not some temporary
            > constructed by the compiler.[/color]

            Wouldn't the above fail to compile? If the lhs is a temporary, it wouldn't
            bind to the non-const-reference first parameter of the operator=.

            Cheers,

            Stuart.
            [color=blue]
            > john[/color]


            Comment

            • Andrey Tarasevich

              #7
              Re: Why can't '='(Assignment) operator be overloaded as friend function?

              Nitin Bhardwaj wrote:[color=blue]
              > ...
              > Why can't the = (assignment) operator be overloaded as a friend
              > function ?
              > I work in VS 6.0 ( Win2000 ) as when i referred the MSDN documen'n it
              > said the following :
              >
              > The operators [] , -> , = cannot be overloaded as static functions
              >
              > from which i figured out that since 'friend' qualifier makes the
              > function a static function( i.e. a per-class member ), hence =
              > operator can't be overloaded as a friend function.But why is such
              > restrction there in the language in the first place ???[/color]

              I guess the real question that was meant by the above wording is why
              copy assignment operator cannot be overloaded by a standalone
              (non-member) function.

              The short answer is because the C++ standard does not allow it. The
              longer answer should probably include the rationale that lead to this
              restriction.

              The rationale is as follows. Since the compiler always provides an
              implicit declaration of copy assignment operator for a class that
              doesn't declare one explicitly, later declaration of standalone copy
              assignment operator would change the meaning of the assignment in the
              middle of the translation unit:

              class A {
              /* no assignment operator explicitly declared */
              };

              void foo() {
              A a, b;
              a = b; // this invokes the implicitly declared assignment
              }

              A& operator =(A& lhs, const A& rhs);

              void bar() {
              A a, b;
              a = b; // this invokes the user-declared assignment
              }

              Note that moving the definition of function 'bar' to some point above
              the declaration of the assignment operator would change its meaning.
              This behavior was considered to be potentially dangerous (and it is).

              For this reason, the copy assignment operator is not permitted to be
              overloaded by a standalone function in C++.

              --
              Best regards,
              Andrey Tarasevich
              Brainbench C and C++ Programming MVP

              Comment

              • vijay

                #8
                Re: Why can't '='(Assignment) operator be overloaded as friend function ?

                Hello
                The reason why a = assignment operator function can't be static is , when u
                right that , u need to have a this pointer for reason one that u need to
                elimite the possiblibity of self assignment
                for this u need a this pointer and this pointer is not passed by default in
                static fuinctions

                WBr
                Vijay

                "Nitin Bhardwaj" <nitinbhardwaj8 0@hotmail.com> wrote in message
                news:17fa8780.0 307110108.69e85 392@posting.goo gle.com...[color=blue]
                > Thanx in advance for the response...
                >
                > I wanna enquire ( as it is asked many a times in Interviews that i
                > face as an Engg PostGraduate ) about the overloading capability of the
                > C++ Language.
                >
                > Why can't the = (assignment) operator be overloaded as a friend
                > function ?
                > I work in VS 6.0 ( Win2000 ) as when i referred the MSDN documen'n it
                > said the following :
                >
                > The operators [] , -> , = cannot be overloaded as static functions
                >
                > from which i figured out that since 'friend' qualifier makes the
                > function a static function( i.e. a per-class member ), hence =
                > operator can't be overloaded as a friend function.But why is such
                > restrction there in the language in the first place ???[/color]


                Comment

                • Andrey Tarasevich

                  #9
                  Re: Why can't '='(Assignment) operator be overloaded as friend function?

                  vijay wrote:[color=blue]
                  > ...
                  > The reason why a = assignment operator function can't be static is , when u
                  > right that , u need to have a this pointer for reason one that u need to
                  > elimite the possiblibity of self assignment
                  > for this u need a this pointer and this pointer is not passed by default in
                  > static fuinctions
                  > ...[/color]

                  There is absolutely no need to have a 'this' pointer to eliminate
                  self-assignment. As long as you can obtain and compare addresses of
                  actual lhs and rhs objects, you can easily detect and eliminate
                  self-assignment.

                  It has nothing to do with 'this' pointer.

                  --
                  Best regards,
                  Andrey Tarasevich
                  Brainbench C and C++ Programming MVP

                  Comment

                  Working...