引用的概念
引用并非新定义一个变量,而是给已经存在的变量取了个别名,编译器不会为引用开辟内存空间,它和它引用的变量共用同一块内存空间。
引用比指针更安全
- 引用在定义时就必须被初始化,而指针若在定义后没有初始化则其将是野指针。
- 引用与被引用的变量共用同一块内存空间,即拥有相同的地址,这使得引用不用进行地址操作,故更加安全。
拷贝构造函数
拷贝构造函数是构造函数的一个重载形式
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;
};
形参用引用原因
主调函数与被调函数采用值传递时,其底层实现逻辑是在栈区为形参开辟一个内存空间并将实参拷贝到改内存空间。
若拷贝构造函数不采用引用传递而采用值传递方式,将会造成套娃,即调用拷贝构造函数内又隐式调用拷贝构造函数且层层嵌套,形成无限递归。
例如
本例参考博文
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;
};