类中默认函数的特点:没有,系统提供 自己提供,系统不提供
构造函数是生成对象的一部分
生成对象:开辟内存,调用构造函数
一、构造函数: //String();
- 作用:创建对象、初始化对象所在的内存空间 给对象赋予资源、类型转换
- 特点:
- 可以重载 //生而不同
- 有this指针,this指针指向对象的内存空间
- 不拿对象调用
- 不可以手动调用,只能系统来调用 //不依赖对象调用
二、析构函数: //~String()
- 作用:释放对象所占资源
- 特点:
- 不可以重载 //死后相同
- 有this指针,this指针指向对象的内存空间
- 可以手动调用,会退化成普通函数的调用 //不建议手动调用
- 原型:函数名和类名相同,形参不需要
三、拷贝构造函数: //String(const String& rhs);
//特殊的构造函数
- 作用:将一个已存在的对象,来生成一个相同类型的新对象
- 原型:函数名和类名相同,形参用const修饰,形参一定要引用(引用不生成新对象,引用是一个别名)
- 特点:
形参一定要用引用,避免递归调用生成形参对象,最终栈溢出,程序崩溃
默认的拷贝构造是一个浅拷贝,要自己实现一个深拷贝
//一旦成员变量里面有指针类型,就得考虑是否实现深拷贝 //给新对象开辟自己独立的内存
String(const String& rhs);
四、赋值运算符的重载函数: //String& operator = (const String& rhs)
stu2 = stu1;
- 作用:拿已存在的对象给相同类型的新对象
- 原型:operator = (const Student& rhs); //为了连续赋值
if(this != &rhs) //为什么一定要做判断
对象和变量不一样
- 返回值:类类型的引用 连续赋值
- 特点:系统提供的是浅拷贝
- 深拷贝:释放旧的资源,开辟
- 赋值:自赋值、释放旧的资源、开辟新的资源、赋值