拷贝构造函数为什么要用引用?

一、引用
1.概念
引用不是新定义一个变量,而是给已经存在的变量取了个别名,编译器不会为引用开辟内存空间,它和它引用的变量共用同一块内存空间。
2.和指针区别

  1. 引用在定义时必须初始化,指针没有要求
  2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  3. 没有NULL引用,但有NULL指针
  4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  6. 有多级指针,但是没有多级引用
  7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  8. 引用比指针使用起来相对更安全

二、拷贝构造函数
1.特征
拷贝构造函数是构造函数的一个重载形式

class String
{
public:
	String(const char* str = "jack")
	{
		_str = (char*)malloc(strlen(str) + 1);
		strcpy(_str, str);
	}
	String(const String& s)
		: _str(new char[strlen(s._str) + 1])
	{
		strcpy(_str, s._str);
	}
	~String()
	{
		cout << "~String()" << endl;
		free(_str);
	}
private:
	char* _str;
};

2.使用

int main()
{
	String s1("hello");
	String s2(s1);//拷贝构造
	return 0;
}

3.原因(这里用日期类进行举例)

class date {
public:
	date(int year, int month, int day)
		:_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;
};

在这里插入图片描述
拷贝构造函数的const date d会对原来的d1进行实例化,调用自身,但被调用后又实例化,再次调用拷贝构造函数,形成无限递归,所以只能引用原来的d2

你可能感兴趣的:(1024程序员节,c++)