在C中有变量的生存周期,那么在C++中就有对象的生存周期。
(1)普通对象的生存周期
若有一个CObject类,属性是姓名和年龄。
CObject gobject1;
int main()
{
CObject object1;
CObject object2("宝宝",10);
return 0;
}
CObject gobject2;
函数调用的先后顺序是:
构造函数:gobject1
gobject2
object1
object2
先构造全局后构造局部。
析构函数:object2
object1
gobject2
gobject1
先构造的后析构。
在堆上开辟一个对象,生存周期为从new到delete,如果没有delete,则不会析构。
CObject("object",1);//生成一个临时对象(显式生成)
(2)临时对象的生存周期
int main()
{
CObject object1;//①
CObject object2("object2",2);//②
object1=CObject("object1",2);//③
CObject 3=CObject("object3",2);//④
}
①调用默认构造函数。
②调用带两个参数的构造函数,显式构造。
③相当于赋值,调用带两个参数的构造函数,运算符重载函数。生成对象时不知道对象名会生成临时对象,临时对象的生存周期是调用的那句完后';'后立马析构。
④相当于初始化,无临时对象生成,因为系统进行了优化,以构造临时量的方法构造了object3。
CObject object1=CObject("object1",2);
CObject object2;
object2=(CObject)("object",2);//生成临时对象,调用带一个参数的构造函数 <=>object2=Cobject(2)
调用的函数:
带两个参数的构造函数
不带参数的构造函数
生成临时对象(带一个参数的构造函数)
赋值运算符重载函数
析构掉临时对象的函数
CObject *pobject=&CObject("pobject",1);//生成1个对象,调用一个构造,一个析构
CObject &pobject=CObject("pobject",1);//生成一个临时对象,调用一个构造,无析构
引用一个临时对象,临时对象的生存周期就变成了引用这个对象的生存周期。
CObject object1=CObject("object1",2);
CObject object2=(CObject)("object2",2);//隐式构造
object1=2;//隐式生成临时对象,调用带一个参数的构造函数,赋值运算符重载函数,析构函数
CObject object2=2;//隐式构造,无临时对象生成(系统进行优化)
若有:
void fun1(CObject rhs){}
void fun2(CObject &rhs){}
void fun3(CObject *rhs){}
在main函数里进行如下操作:
CObject object1;
fun1(object1);//无参构造函数,拷贝构造函数(实参穿形参)
fun1(CObject("pobject",1));//带两个参数的构造函数
fun2(object1);
fun2(CObject("pobject",1));//引用一个临时对象生存周期延长
fun3(&object1);//可使用
fun3(&CObject("pobject",1));//可访问
临时量产生的类型:
1、内置类型,产生的临时量是常量
2、类类型,产生的临时量是变量
3、隐式产生的临时量也是常量
赋值运算符的重载函数:
1、修饰形参不能改变
2、接受隐式产生的临时量