您的位置:首页 > 编程语言 > C语言/C++

C++面向对象(二)

2017-06-18 16:46 253 查看
1.类对象的生存周期

要注意的问题:对象什么时候构造,什么时候析构,是否产生临时量,怎样产生临时量,临时量何时构造,临时量何时析构;

Q:临时对象的生存周期?

A:临时对象所在的语句,语句结束,临时对象析构

Q:显示生成临时对象和隐式生成临时对象

A:指定类型名:显示生成,看不见类名:隐式生成;隐式生成的对象都是常对象

(1)    CGoods  good4 = CGoods(“shangpin”,30,12.5)

//显示生成临时对象

分析:临时对象在定义时产生,出所在语句生存期结束(;,?),编译器在用临时对象构造同类型的新对象时,临时对象并不产生,用构造临时对象的方式直接构造目标对象。(编译器的优化,省去了临时对象的生成,再调用拷贝构造构造good4,再析构的繁琐过程)

   (2)CGoods   good1;

       good1 = CGoods(“shangpin”,30,12.5);

  分析:用临时对象给good1赋值,临时对象必须产生。过程是先调用构造函数,生成临时对象,调用赋值运算符重载,给good1赋值,临时对象析构。

   (3) CGoods   good1;

       good1 = (CGoods)(“shangpin”,30,12.5);//强转,存在逗号表达式;

       等同于:good1 =(CGoods)12.5;//显示生成临时对象

    (4)其他类型转换为类类型:看该类有没有构造函数,以其他类型作为参数,若有该构造函数,则可以转换。

CGoods<----doulbe

Good1  =  89.5//若有该构造函数则可以转换,隐式生成的临时对象都是常对象。常对象要用常引用

(5)CGoods  *p = &CGoods (“shangpin”,30,12.5);

   //分析:产生的临时对象在该语句结束时析构,p指向一块无效的内存,不能用指针指向一个临时对象

   CGoods  &p = CGoods(“shangpin”,30,12.5);

   //分析:临时对象的周期提升为引用变量的生存周期,即引用之后,临时对象并不马上析构,生存周期和引用变量相同。

(6)void   test(CGoods  *p)//此处传指针会不会出错

{}                 // 不会,test执行结束,临时对象才析构

Int    main()

{

   test(&CGoods(“shangpin”,30,12.5);//作用域

}

*explicit关键字:明确的,禁止隐式对象的生成,一般是给构造函数和拷贝构造函数加。

 

2.函数返回对象,临时量的分析

函数返回对象,不管该对象占用多大内存,都会产生临时量

*在一个函数的调用点之前,一定要看到函数的声明或定义。

确定:(1)实参匹配形参的类型,个数;

(2)函数调用点返回值的类型和函数声明或定义时返回值的类型是否匹配;

      (3)根据返回值类型确定返回方式;

对于c语言(自定义类型):

struct  Data

{                         

int a;

 int b;

 char c;

}//12字节,会产生临时量

Data func();

  int main()



     Data  data;

    data = func();//编译时,编译器给func()压入了参数,如果只是调用func()不压参数没关系,但若使用了func的返回值,一定要有参数将临时量的地址返回

}

 

(1)     Test Getobjct(Test t)//Test&t少一个新对象的产生

{

     int value= t.Getvalue();

     Test tmp(value);

      return tmp;//拷贝构造临时对象

}

int main()

{

     Test t1(10);

     Test t2;

     t2 = GetObject(t1)//产生临时量

}

函数栈帧的开辟:



(2)



(3)



总结:返回一个对象时,应该返回一个临时对象,当接收一个返回对象的返回值的时候,应该定义时直接得到返回值(即处理成一个初始化的过程),效率更高
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: