概念:拷贝构造函数,只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
特征:
1. 拷贝构造函数是构造函数的一个重载形式
如:
2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
造成原因(自己画的图):
3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
我们来看这个代码:
class Stack
{
public:
Stack(int x=4);
//Stack(const Stack& st);
void StackPush(int x);
~Stack();
private:
int* _a;
int _top;
int _capacity;
};
Stack::Stack(int x)
{
_a=(int*)malloc(sizeof(int) * x);
_top = 0;
_capacity = 4;
}
void Stack::StackPush(int x)
{
_a[_top++] = x;
}
Stack::~Stack()
{
free(_a);
_a = nullptr;
_top = 0;
_capacity = 0;
}
int main()
{
Stack st1;
st1.StackPush(1);
Stack st2 = st1;
return 0;
}
如果我们没定义这个函数,编译器自动生成的会完成浅拷贝。
注意:1.他们指针指向的地址都相同,这肯定是不行的,毕竟析构函数会free两次相同的空间。
2.所以我们就需要自己完成一个深拷贝,在这就不去实现了。