C++拷贝构造函数

本文用于自己记录学习,由于初学C++,可能某些表述不正确,欢迎批评指正!

C++拷贝构造函数
当我们没有重写拷贝构造函数时,系统会自己默认生成一个拷贝构造函数,

什么时候会调用这个拷贝构造函数:

  • 通过使用另一个同类型的对象来初始化新创建的对象。
  • 复制对象把它作为参数传递给函数。
  • 复制对象,并从函数返回这个对象。

我们可以自己重写一下这个拷贝构造函数

#include<iostream>
using namespace std;
class A{
	public:
		int length;
		A(int len){
			cout<<"调用有参构造函数"<<endl;
			length=len;
		}
		//拷贝构造函数
		A(const A &a){
			cout<<"调用拷贝构造函数"<<endl;
			//length=a.length;
		} 
	
};
class B:public A{
	public:
		int length;
		B(int len):A(len){}
};
void print(A a){
		cout<<"length="<<a.length<<endl; 
	}
int main(){
	A a(10);//调用有参构造函数
	cout<<a.length<<endl;
	 A a1=a;//调用拷贝构造函数 
	 cout<<"a1.length="<<a1.length<<endl;
    print(a);//调用拷贝构造函数 
	 
}

看看结果:

调用有参构造函数
10
调用拷贝构造函数
a1.length=-1
调用拷贝构造函数
length=0

    可以看到当执行 A a1=a;或者  print(a);都会调用这个拷贝构造函数,

但是由于重写的拷贝构造函数没有实现复制,因此a1.length和打印出来的length都不是本来想复制过去的值

下面将入修改拷贝构造函数的实现代码:

#include<iostream>
using namespace std;
class A{
	public:
		int length;
		A(int len){
			cout<<"调用有参构造函数"<<endl;
			length=len;
		}
		//拷贝构造函数
		A(const A &a){
			cout<<"调用拷贝构造函数"<<endl;
			length=a.length;
		} 
	
};
class B:public A{
	public:
		int length;
		B(int len):A(len){}
};
void print(A a){
		cout<<"length="<<a.length<<endl; 
	}
int main(){
	A a(10);//调用有参构造函数
	cout<<a.length<<endl;
	 A a1=a;//调用拷贝构造函数 
	 cout<<"a1.length="<<a1.length<<endl;
    print(a);//调用拷贝构造函数 
	 
}

看看结果:

调用有参构造函数
10
调用拷贝构造函数
a1.length=10
调用拷贝构造函数
length=10

当实现拷贝函数的拷贝功能时就是正确的值了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值