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

[C++]--对象创建的两种方式

2016-04-03 20:24 375 查看
也不知道到底是怎么回事,最近学了C++以后老是会混淆两种创建对象的方法,这里做一个大体的总结:

第一种:使用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++ 创建对象