构造函数:初始化对象的时候自动调用成员方法
- 如果不自己实现,编译器会默认生成一个默认构造函数
- 如果自己实现,则编译器不会生成
- 构造函数可以重载
拷贝构造:用一个已经存在的对象,构造同类型的新对象
- 防止浅拷贝
- 如果不自己实现,默认生成一个浅拷贝的拷贝构造
- 拷贝构造函数必须传引用(防止递归拷贝构造)
重载= :用一个已经存在的对象给另一个已经存在的对象赋值
- 如果不自己实现,编译器会默认生成一个浅拷贝的=
- 防止自赋值
- 防止内存泄漏
- 防止浅拷贝
析构函数:一个对象生存周期满,自动调用的成员方法
- 不可以重载,没有参数
- 如果不自己实现,编译器会默认生成
- 防止内存泄漏
临时对象
- 临时对象的生存周期只在本语句
- 临时对象如果被引用,它的生存周期就和引用相同
假设有一个CGoods类
1、CGoods s1 = "huotui";
/*
(1)用"huotui"构造一个临时对象
(2)用该临时对象拷贝构造s1
(3)析构该临时对象
以上三步可以优化为:用"huotui"直接构造s1
*/
2、s1 = "rou";
/*
(1)用"rou"构造一个临时对象
(2)用该临时对象给s1赋值
(3)析构该临时对象
不可以优化
*/
3、CGoos &s2 = (CGoods)"fangbianmian"
/*
(1)用"fangbianmian"构造一个临时对象
(2)将该临时对象的引用给s2;
*/
CGoods fun(const CGoods good)
{
CGoods good1 = good;
return good1;
}
int main()
{
CGoods s1 = "huotui"//构造s1
fun(s1);
/*
(1)拷贝构造参数
(2)用参数拷贝构造good1
(3)用good1在主函数栈帧中拷贝构造一个临时对象
(4)fun函数析构good1
(5)fun函数析构参数goods
(6)fun函数栈帧回退完成,主函数先析构临时对象
(7)主函数析构s1
*/
return 0;
}
- 显示对象:出现类型名
- 隐式对象:不出现类型名
- 内置类型的临时对象是常量
- 不允许泄漏常量的引用或指针给非常量的引用或指针
- 自定义类型产生的临时对象:隐式:常量 显示:非常量