一、引用
1.概念
引用不是新定义一个变量,而是给已经存在的变量取了个别名,编译器不会为引用开辟内存空间,它和它引用的变量共用同一块内存空间。
2.和指针区别
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全
二、拷贝构造函数
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