C++面向对象(二)
来源:互联网 发布:php个人发卡平台源码 编辑:程序博客网 时间:2024/06/16 04:43
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)
总结:返回一个对象时,应该返回一个临时对象,当接收一个返回对象的返回值的时候,应该定义时直接得到返回值(即处理成一个初始化的过程),效率更高
- C#VS面向对象基础(二)
- Objective C 面向对象编程(二)
- 初识Objecive-C 之 面向对象(二)
- Object-c 面向对象(二)
- 【C#】总结二——面向对象
- C#——面向对象(二)
- 面向对象C语言(Objective-C)编程(二)
- 从C/C++到Objective-C(二)--- 面向对象
- Object-C学习笔记二-----面向对象编程基础知识
- 用C语言实现面向对象程序设计(二)
- C语言面向对象编程(二):继承详解
- Objective-C的面向对象特性(二)
- C语言面向对象编程(二):继承详解
- Object-C学习笔录(二)面向对象
- Objective-C学习笔记二:面向对象概述
- C语言面向对象编程(二):继承详解
- C语言面向对象编程之二:继承
- 面向对象(二)
- redis总结
- C#——面向对象 (一)
- CentOS6.9上安装Redmine3.3.3
- Android Studio安装配置教程
- 软件工程(C编码实践篇)
- C++面向对象(二)
- Node.js中npm常用命令大全
- Sql语句之having
- 虚拟机VMware上Ubuntu与主机windows之间互相复制与粘贴
- 基于Python和Scikit-Learn的机器学习介绍
- perl 之 join和 split
- 函数指针
- Computer Vision ---- Introduction to Computer Vision
- HttpServletRequest 对文件上传的支持