This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: A question about complier for C++


Hi John:
Thanks for your help!
I think maybe I know the rule.
And in my opinion, the constructor of base class (if defined) will always be invoked in spite of whether the derived class has its own constructor,
but the copy constructor and assignment operator in base class(if defined) will not be invoked if the derived class has its own.
Is it right?


Thank you very much!

John Love-Jensen ??:
Hi Fan Lu,

Do the copy assignment operator and copy constructor in derived class
will automatically invoke the corresponding functions in base class?

Yes and no.


YES. The C++ generated synthetic assignment operator and copy constructor in
derived classes will automatically invoke the corresponding function in the
base class.

NO.  If you provide your own assignment operator and copy constructor, you
have to invoke the corresponding functions from the base class explicitly.

Or I need explicit invoke the A:A or A& operator= in B:B or B& operator=?

Yes and no.


YES, for your explicit ones, assuming that doing so it the "right thing to
do" for your class.

NO, for the synthesized ones (but if you are using the synthesized ones in
your derived classes, you wouldn't be able to explicitly do it anyway),
since the synthesized ones will do that for you.  (Which *MAY* be the "wrong
thing to do" in some circumstances.)

HTH,
--Eljay

#include <iostream>

using std::cout;
using std::endl;

class A
{
public:
  A() { cout << "A default constructor" << endl; }
  A(A const&) { cout << "A copy constructor" << endl; }
  A& operator=(A const&) { cout << "A assignment operator" << endl; }
};

class B : public A
{
public:
  B() { cout << "B default constructor" << endl; }
  B(B const&) { cout << "B copy constructor" << endl; }
  B& operator=(B const&) { cout << "B assignment operator" << endl; }
};

int main()
{
  cout << "----------------" << endl;
  cout << "Test copy constructor..." << endl;
  B b1;
  B b2(b1);
  cout << "----------------" << endl;
  cout << "Test assignment operator..." << endl;
  b2 = b1;
  cout << "----------------" << endl;
}




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]