类对象的生存周期

来源:互联网 发布:好医生app软件 编辑:程序博客网 时间:2024/05/22 00:54

请先来看一段代码

#include<iostream>#include<string.h>#pragma warning(disable:4996)using namespace std;class CGoods{public:CGoods(){}CGoods(float price){_price=price;}CGoods(char *name,int amount,float price){_name=new char[strlen(name)+1];strcpy(_name,name);_amount=amount;_price=price;}~CGoods(){}CGoods(const CGoods &rhs){_name=new char[strlen(rhs._name)+1];strcpy(_name,rhs._name);_amount=rhs._amount;_price=rhs._price;}void Operator(const CGoods &rhs){if(this==&rhs){return;}delete[]_name;_name=new char[strlen(rhs._name)+1];strcpy(_name,rhs._name);_amount=rhs._amount;_price=rhs._price;}private:char *_name;int _amount;float _price;};int main(){CGoods good1;                        //不带参数的构造函数CGoods good2("shangpin1",20,9.5);    //带3个参数的构造函数CGoods good3(good2);                 //拷贝构造函数good1=good3;                      //赋值运算符重载函数good1=CGoods("shangpin2",30,12.5);  //构造临时对象、赋值运算符重载函数、析构临时对象        //显示生成临时对象        //临时对象的生存周期:临时对象所在语句,即一个表达式结束(,;?)       CGoods good4=CGoods("shangpin2",30,12.5);       //带三个参数的构造函数        //用临时对象构造同类型的新对象的时候,此时临时对象不生成,用构造临时对象的方法直接构造目标对象(编译器的优化)good1=89.5;        //构造临时对象、赋值运算符重载函数、析构临时对象        //隐式生成临时对象    其他类型->类类型:看该类有没有构造函数,以其他类型作为参数个数,隐式生成一个临时对象                good1=(CGoods)("shangpin2",30,12.5);    //构造临时对象、赋值运算符重载函数、析构临时对象        //内含逗号表达式 等同于good1=CGoods(12.5);
       CGoods *p=&CGoods("shangpin2",30,12.5); //构造临时对象、析构临时对象        //错误,出了语句P指针就为野指针         CGoods &q=CGoods("shangpin2",30,12.5); //带三个参数的构造函数        //正确,引用一个对象,临时对象的生存周期就变成引用这个对象的生存周期}