对象生存周期

构造函数:初始化对象的时候自动调用成员方法

  •  如果不自己实现,编译器会默认生成一个默认构造函数
  •  如果自己实现,则编译器不会生成
  •  构造函数可以重载

拷贝构造:用一个已经存在的对象,构造同类型的新对象

  •  防止浅拷贝
  •  如果不自己实现,默认生成一个浅拷贝的拷贝构造
  •  拷贝构造函数必须传引用(防止递归拷贝构造)

重载= :用一个已经存在的对象给另一个已经存在的对象赋值

  •  如果不自己实现,编译器会默认生成一个浅拷贝的=
  •  防止自赋值
  •  防止内存泄漏
  •  防止浅拷贝

析构函数:一个对象生存周期满,自动调用的成员方法

  • 不可以重载,没有参数
  • 如果不自己实现,编译器会默认生成
  • 防止内存泄漏

临时对象

  • 临时对象的生存周期只在本语句
  • 临时对象如果被引用,它的生存周期就和引用相同

假设有一个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;
}
  • 显示对象:出现类型名
  • 隐式对象:不出现类型名
  • 内置类型的临时对象是常量
  • 不允许泄漏常量的引用或指针给非常量的引用或指针
  • 自定义类型产生的临时对象:隐式:常量        显示:非常量

猜你喜欢

转载自blog.csdn.net/qq_41727218/article/details/84197719