拷贝构造函数

本文深入探讨了拷贝构造函数的概念及其在C++中的应用。解释了拷贝构造函数的特征,包括其作为构造函数的重载形式,以及为什么参数必须使用引用传参。通过具体代码示例,展示了如何实现拷贝构造函数,并讨论了浅拷贝和深拷贝的区别,以及在涉及动态分配资源的对象中正确实现拷贝构造函数的重要性。
摘要由CSDN通过智能技术生成

拷贝构造函数

那在创建对象时,可否创建一个与一个对象一某一样的新对象呢?

构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象 创建新对象时由编译器自动调用

1.特征

拷贝构造函数也是特殊的成员函数,其特征如下:

  1. 拷贝构造函数是构造函数的一个重载形式
  2. 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用
class Date
{
public:
	Date(int year = 1990, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	Date d2(d1);

	return 0;
}
  1. 若显示未定义,系统生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。
  2. 那么编译器生成的默认拷贝构造函数以及可以完成字节序的值拷贝了,我们还需要自己实现吗?我们验证一下试试。
// 这里会发现下面的程序会崩溃掉?这里就需要我们以后讲的深拷贝去解决。 
class String 
{ 
public:
    String(const char* str = "jack")   
     {
             _str = (char*)malloc(strlen(str) + 1);
                     strcpy(_str, str);    
       }
 
    ~String()    
    {
            cout << "~String()" << endl;
            free(_str);    
    } 
    private:
        char* _str; 
 };
 
int main()
{ 
   String s1("hello");    
   String s2(s1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值