拷贝(复制)构造函数
拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用
形式如下:
class 类名{
public :
类名(形参); //构造函数
类名(类名 &对象名);//拷贝构造函数
};
拷贝构造函数实例:
#include<iostream>
using namespace std;
class Point{
public:
Point(); //缺省构造函数
Point(int X,int Y); //带参构造函数
~Point(); //析构函数
Point(Point &p); //拷贝构造函数声明
void setPoint(int X,int Y); //设置点坐标
int getX(); //获得点的X坐标
int getY(); //获得点的Y坐标
void setX(int X); //设置点的X坐标
void setY(int Y); //设置点的Y坐标
private:
int x,y;
};
Point::Point(){
x = 0;
y = 0;
cout<<"缺省样式的构造函数调用完毕"<<endl;
}
Point::Point(int X,int Y){
x = X;
y = Y;
cout<<"带参构造函数调用完毕"<<endl;
}
Point::~Point(){
cout<<"点("<<x<<","<<y<<")"<<"析构函数调用完毕"<<endl;
}
Point ::Point(Point &p){
x = p.x;
y = p.y;
cout<<"拷贝构造函数调用完毕"<<endl;
}
void Point::setPoint(int X,int Y){
x = X;
y = Y;
}
int Point::getX(){
return x;
}
int Point::getY(){
return y;
}
void Point::setX(int X){
x = X;
}
void Point::setY(int Y){
y = Y;
}
int main(void)
{
Point p1(10,10),p2(p1);
p1.setPoint(1,1);
return 0;
}
运行结果如下:
如果没有为类声明构造函数,则编译器自己生成一个拷贝构造函数。
- 该拷贝构造函数所执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应的数据成员
拷贝构造函数的主要应用场景:
- (1) 在声明语句中用一个对象初始化另一个对象。例如
Point p1;
Point p2 = p1,p3(p1);
- (2) 若函数的形参是类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。
例如,将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本。
void fun1(Point p){
cout<<p.getX()<<endl;
}
void main(){
Point A(1,2);
fun1(A);
}
拷贝构造函数各种调用场合举例:
#include<iostream>
using namespace std;
class Point{
public:
Point(); //缺省构造函数
Point(int X,int Y); //带参构造函数
~Point(); //析构函数
Point(Point &p); //拷贝构造函数声明
void setPoint(int X,int Y); //设置点坐标
int getX(); //获得点的X坐标
int getY(); //获得点的Y坐标
void setX(int X); //设置点的X坐标
void setY(int Y); //设置点的Y坐标
private:
int x,y;
};
Point::Point(){
x = 0;
y = 0;
cout<<"缺省样式的构造函数调用完毕"<<endl;
}
Point::Point(int X,int Y){
x = X;
y = Y;
cout<<"带参构造函数调用完毕"<<endl;
}
Point::~Point(){
cout<<"点("<<x<<","<<y<<")"<<"析构函数调用完毕"<<endl;
}
Point ::Point(Point &p){
x = p.x;
y = p.y;
cout<<"拷贝构造函数调用完毕"<<endl;
}
void Point::setPoint(int X,int Y){
x = X;
y = Y;
}
int Point::getX(){
return x;
}
int Point::getY(){
return y;
}
void Point::setX(int X){
x = X;
}
void Point::setY(int Y){
y = Y;
}
void f(Point p) //函数的形参是类的对象
{
cout<<"函数f之中"<<p.getX()<<","<<p.getY()<<endl;
}
Point g(){ //函数的返回值是类的对象
Point a(7,33);
cout<<"函数g之中:"<<endl;
return a;
}
int main()
{
Point p1,p2(15,10),p3(p1),p4 = p2;
f(p2);
p2 = g();
return 1;
}
运行结果:
Notice:只有在声明语句中使用一个变量初始化另一个对象才调用拷贝构造函数
int main()
{
Point p1(1,2),p2 = p1;
return 1;
}
反之,不调用拷贝构造函数
int main()
{
Point p1(1,2),p2;
p2 = p1;
return 1;
}