复制构造函数又称为拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。它存在唯一一个参数是不可变的。这个函数经常在函数调用期间于用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。一般它使用常量方式调用,另外,它也可以用非常量方式调用。
在c++中,有3中对象需要复制的情况。这时,复制构造函数将会被调用,具体如下。
一个对象以值传递的方式传入函数体。
一个对象以值传递的方式从函数返回。
一个对象需要通过另外一个对象进行初始化。如果在前两种情况下不使用复制构造函数的时候,就会导致一个指针指向已经被删除的内存空间。
对于这3种情况来说,初始化和复制的不同含义是构造函数调用的原因。事实上,复制构造函数是由普通构造函数和赋值操作符共同实现的。复制构造函数的示例代码如下:
#include <iostream>
using namespace std;
class A
{
public:
A(int ix, int iy)
{
x = ix;
y = iy;
cout << "构造函数调用" << endl;
}
A()
{
cout << "无参构造函数调用" << endl;
}
A(A& a)
{
x = a.x;
y = a.y;
cout << "复制构造函数调用" << endl;
}
protected:
private:
int x;
int y;
};
int main()
{
A a(2, 3);
A b(4, 5);
a = b;
A c = b;//调用复制构造函数
cout << "b地址=" << &b << endl;
cout << "c地址=" << &c << endl;
A aa;
aa = A(3, 4);
A a2 = A(a);//调用复制构造函数
system("pause");
return 0;
}
有3种情况会使用复制构造函数:
一个对象以值传递的方式传入函数体。
一个对象以值传递的方式从函数返回。
一个对象需要通过另外一个对象进行初始化。
在c++中,有3中对象需要复制的情况。这时,复制构造函数将会被调用,具体如下。
一个对象以值传递的方式传入函数体。
一个对象以值传递的方式从函数返回。
一个对象需要通过另外一个对象进行初始化。如果在前两种情况下不使用复制构造函数的时候,就会导致一个指针指向已经被删除的内存空间。
对于这3种情况来说,初始化和复制的不同含义是构造函数调用的原因。事实上,复制构造函数是由普通构造函数和赋值操作符共同实现的。复制构造函数的示例代码如下:
#include <iostream>
using namespace std;
class A
{
public:
A(int ix, int iy)
{
x = ix;
y = iy;
cout << "构造函数调用" << endl;
}
A()
{
cout << "无参构造函数调用" << endl;
}
A(A& a)
{
x = a.x;
y = a.y;
cout << "复制构造函数调用" << endl;
}
protected:
private:
int x;
int y;
};
int main()
{
A a(2, 3);
A b(4, 5);
a = b;
A c = b;//调用复制构造函数
cout << "b地址=" << &b << endl;
cout << "c地址=" << &c << endl;
A aa;
aa = A(3, 4);
A a2 = A(a);//调用复制构造函数
system("pause");
return 0;
}
有3种情况会使用复制构造函数:
一个对象以值传递的方式传入函数体。
一个对象以值传递的方式从函数返回。
一个对象需要通过另外一个对象进行初始化。