简单的说,有两句话
1、对于编译器合成的拷贝初始化函数和重载的赋值运算符,编译器自动产生代码来调用基类的拷贝初始化函数和重载的赋值运算符,并且依次调用成员对象(相对于简单类型如int 而言)的拷贝初始化函数和重载的赋值运算符。
2、对于显式定义的拷贝初始化函数和重载的赋值运算符,编译器不会在其中产生代码来调用基类的拷贝初始化函数和重载的赋值运算符,也不会产生代码来依次调用成员对象(相对于简单类型如int 而言)的拷贝初始化函数和重载的赋值运算符。
下面是一例:
#include<stdio.h>
#include<iostream>
using namespace std;
class A
{ public:
int a;
A(){}
A(const A&other)
{
a=other.a;
cout<<"A's copy constructor called."<<endl;
}
A& operator=(const A& other)
{
a=other.a;
cout<<"A's assignment operator called."<<endl;
return *this;
}
};
class B:public A
{
public :
A a;
A a1;
B(){}
//B(const B&other)
//{
// cout<<"B's copy constructor called."<<endl;
// }
// B& operator=(const B& other)
//{
// cout<<"B's assignment operator called."<<endl;
// return *this;
// }
};
void main()
{
B b1;
B b2=b1;//初始化
b2=b1; //赋值
}
输出结果是:
A's copy constructor called.
A's copy constructor called.
A's copy constructor called.
A's assignment operator called.
A's assignment operator called.
A's assignment operator called.
下面将代码中的注释去掉,如下:
#include<stdio.h>
#include<iostream>
using namespace std;
class A
{ public:
int a;
A(){}
A(const A&other)
{
a=other.a;
cout<<"A's copy constructor called."<<endl;
}
A& operator=(const A& other)
{
a=other.a;
cout<<"A's assignment operator called."<<endl;
return *this;
}
};
class B:public A
{
public :
A a;
A a1;
B(){}
B(const B&other)
{
cout<<"B's copy constructor called."<<endl;
}
B& operator=(const B& other)
{
cout<<"B's assignment operator called."<<endl;
return *this;
}
};
void main()
{
B b1;
B b2=b1;//初始化
b2=b1; //赋值
}
则输出结果如下:
B's copy constructor called.
B's assignment operator called.