[C++]--对象创建的两种方式
2016-04-03 20:24
375 查看
也不知道到底是怎么回事,最近学了C++以后老是会混淆两种创建对象的方法,这里做一个大体的总结:
这种方式有两点需要注意的,一点是用new创建的是对象指针,此时将调用构造函数,delete的也是对象指针,此时将调用析构函数。
也可以先定义类指针,然后再用new开辟内存空间。
以下是《C++primer plus Edition 6》里的关于new的摘抄:
计算机可能会由于没有足够的内存而无法满足new的请求。造成内存耗尽的情况发生。对于此种情况c++提供了检测并处理内存分配失败的工具。
不要尝试释放已经释放的内存块,这意味着什么都不会发生。
这种创建对象的方法不需要显式地调用delete,析构函数会自动调用。
又:
第一种:使用new的方式创建的对象
clock* alarm = new clock; delete alarm;
这种方式有两点需要注意的,一点是用new创建的是对象指针,此时将调用构造函数,delete的也是对象指针,此时将调用析构函数。
也可以先定义类指针,然后再用new开辟内存空间。
以下是《C++primer plus Edition 6》里的关于new的摘抄:
4.7.4 使用new来分配内存:
程序员要告诉new,需要为哪种数据类型分配内存;new将找到一个长度正确的内存块,并返回该内存块的地址,程序员的责任是将该地址付给一个指针。下面是一个这样的示例:int * pn = new int;new int告诉程序,需要适合存储int的内存。new运算符根据类型来确定多少字节的内存。然后他找到这样的内存,并返回其地址。接下来将地址赋给pn,pn是被声明为指向int的指针。现在,pn就是地址,而*pn就是存储在那里的值。
计算机可能会由于没有足够的内存而无法满足new的请求。造成内存耗尽的情况发生。对于此种情况c++提供了检测并处理内存分配失败的工具。
4.7.5 使用delete释放内存
当需要内存时,可以用new来申请,而使用delete运算符,是的内存使用完了以后能够将其归还给内存池。使用delete时,后面要加上指向内存块的指针,这些内存块最初是由new分配的:int * ps = new int; ...... delete ps;这将释放ps指向的内存,但不会删除ps指针本身。例如,可以将ps重新指向一个新分配的内存块。一定要配对的使用new和delete;否则将发生内存泄漏(memory lack),也就是说,新分配的内存再也无法使用了。如果内存泄露严重,则程序将由于不断寻找新的更多内存而终止。
不要尝试释放已经释放的内存块,这意味着什么都不会发生。
<span style="font-size:18px;">警告:只能用delete来释放使用new分配的内存。然而,对于空指针使用delete是安全的。</span>
第二种:不用new,直接使用类定义申明
clock alarm;
这种创建对象的方法不需要显式地调用delete,析构函数会自动调用。
又:
clock alarm();//这种方式是错误的,只有在调用带参数的构造函数创建对象时,才会用括号()把参数传进去,如果想调用无参数的构造函数创建对象,是不能带括号的,编译器会报错。
clock alarm;//调用的是不带参数的构造函数,不定义的话,编译器会默认一个
clock alarm(alarm2);//调用的是复制构造函数,没定义的话,编译系统也会自动提供一个默认的复制构造函数,但只是简单地复制类中每个数据成员,定义的话,就会调用是你自己的。
clock alarm(1,2);//调用自己写的构造函数,有两个传入参数
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- Windows Powershell创建对象
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解