运算符方程和函数的区别别

[转载]C++/C语言的标准库函数与运算符的区别new/delet
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。下面来看他们的区别。
一、操作对象有所不同
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能把执行构造函数和析构函数的任务强加于malloc/free。
运算符是语言自身的特性,它有固定的语义,而且编译器也知道意味着什么。就像 +-*/
一样,由编译器解释语义,生成相应的代码。&库函数是依赖于库的,没有库就没有它,也就是一定程度上独立于语言的。理论上,编译器不知道也不关心函数的作用,编译器只保证编译函数,以及调用该函数时参数和返回值符合语法,并生成相应
call 函数的代码。但实际中一些高级点的编译器,都会对标准库自带的一些函数进行特别处理。
二、在用法上也有所不同
函数malloc的原型如下:
void&*&malloc(size_t&size);
用malloc 申请一块长度为length 的整数类型的内存,程序如下:
int&*p&=&(int&*)&malloc(sizeof(int)&*&length);
我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。
1、malloc返回值的类型是void *,所以在调用malloc时要显示地进行类型转换,将void *
转换成所需要的指针类型。
2、mallo函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。
函数free的原型如下:
void&free(&void&*&memblock&);
为什么free 函数不象malloc
函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。
new/delete的使用要点
运算符new使用起来要比函数malloc简单得多,例如
int&*p1&=&(int&*)malloc(sizeof(int)&*&length);
int&*p2&=&new&int[length];
这是因为new
内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。
如果new创建对象数组,那么只能使用对象的无参构造函数。例如:
Obj&*objects&=&new&Obj[100];&//&创建100&个动态对象&
Obj&*objects&=&new&Obj[100](1);//&创建100&个动态对象的同时赋初值1
在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如
delete&[]&//&正确的用法
delete&&//&错误的用法
后者相当于delete objects[0],漏掉了另外99 个对象。
1、new自动计算需要分配的空间,而malloc需要手工计算字节数
2、new是类型安全的,而malloc不是,比如:
int*&p&=&new&float[2];&//&编译时指出错误
int*&p&=&malloc(2*sizeof(float));&//&编译时无法指出错误
new operator 由两步构成,分别是 operator new 和 construct
3、operator new对应于malloc,但operator
new可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设别上。而malloc无能为力
4、new将调用constructor,而malloc不能;delete将调用destructor,而free不能。
5、malloc/free要库文件支持,new/delete不要。
malloc/free是c/C++语言的标准库函数,new/delete是C++的运算符。
对于用户自定义的对象而言,用malloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此,C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
Obj(&)&{&cout&&&&“Initialization”&&&&&}
~&Obj(&)&{&cout&&&&“Destroy”&&&&&}
void&Initialize(&)&{&cout&&&&“Initialization”&&&&&}
void&Destroy(&)&{&cout&&&&“Destroy”&&&&&}
void&UseMallocFree(&)
Obj&*&a&=&(obj&*&)&malloc(&sizeof&(&obj&)&);&//&allocate&memory&
a&-&&Initialize();&//&initialization
a&-&&Destroy();&//&deconstruction&
free(a);&//&release&memory
void&UseNewDelete(&void&)
Obj&*&a&=&new&O&
delete&a;&
类Obj的函数Initialize实现了构造函数的功能,函数Destroy实现了析构函数的功能。函数UseMallocFree中,由于
malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成“构造”与“析构”。
所以我们不要用
malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言
malloc/free和new/delete是等价的。
既然new/delete的功能完全覆盖了malloc
/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用
free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete,malloc/free必须配对使用。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您的位置: >> 程序设计视频教程 >> 从新手到高手:C++全方位学习
从新手到高手:C++全方位学习
作者:范磊
eNet硅谷动力
  本教程作者:范磊,山东泰安科技大学教师,联系信箱:。擅长VC、MFC、DELPHI、J2SE开发手机游戏,VC编写数据库,VC游戏开发等。本教程为书籍配套教程,书籍名称:《零起点学通C++》
  基于这个理念,我完成了该书的创作,其中的艰辛自不必说,不过令人欣慰的是,该书确实能够行之有效地帮助后来人少走许多弯路。这是由于该书不会象其他书一样首先讲述理论知识,然后讲语言特征,在概括完语言特征后再去讲解语言的基本知识,结果往往使读者纠缠于编程底层的实现,而忽略了他应该掌握的内容。
  本书不再按照以往的模式,而是首先以一个最简短的C++程序讲起,通过对这个完整的程序的实际编写引申出一些相关的知识,然后在后面的教程中对该程序不断地扩大和完善,这样方才使读者不至于一上来就被C++吓坏,同时也能深刻地理解C++的各个特性的设置目的。
更多章节:
网友留言:
loading...
最新视频教程
| 加入收藏 |
网站合作、内容监督、商务咨询、投诉建议:010-
Copyright © 2000-- 硅谷动力公司版权所有 京ICP证000088号重载函数_百度百科
关闭特色百科用户权威合作手机百科
收藏 查看&重载函数
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的(指参数的个数、类型或者顺序)必须不同,也就是说用同一个完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的不同的问题。外文名overloaded function属&&&&性特殊函数
两个重载函数必须在下列一个或两个方面有所区别:
1、函数有不同参数。
2、函数有不同参数类型,
C++的这种编程机制给编程者极大的方便,不需要为功能相似、参数不同的函数选用不同的函数名,也增强了程序的可读性。
C++重载的相关规定如下:
(1)不能改变的优先级;
(2)不能改变运算符的结合型;
(3)不能和重载的一起使用;
(4)不能改变运算符的的个数;
(5)不能创建新的,只有已有运算符可以被重载;
(6)运算符作用于C++内部提供的时,原来含义保持不变。重载函数(overloaded function)是C++支持的一种特殊函数,C++对的判断更是C++语言中最复杂的内容之一。
首先我们先明确一下重载函数的定义:在相同的声明域中的函数名相同的,而参数表不同的,即通过函数的参数表而唯一标识并且来区分函数的一种特殊的函数。
您也许要问,函数为什么要重载呢?何时应该重载(function overloading),何时又不呢?这也是我要在下面介绍的。
函数的重载其实就是“一物多用”的思想(这里指的“物”是“函数名”),其实不仅是函数可以重载,运算符也是可以重载的。例如:运算符“&&”和“&&”既可以作为移位运算符,有可以作为输出流中的插入运算符和输入流中的提取运算符。
当将要定义一组函数,使它们执行一系列的操作,但是它们是应用在不同的参数类型上的。此时我们可以选择重载函数。
例如: int z_x_max (int,int); //返回两个整数的最大值;
int ve_max (const vector &int& &); //返回vector容器中的最大值;
int matrix_max (const matrix &); //返回matrix引用的最大值;
上面的三个函数都可以大概地说成判断一组数中的最大值,对于函数的用户来说,他们并不关心函数定义的细节,也就是说他们不关心判断两个整数的大小和判断(vector容器)数的大小应该使用不同的函数,而对于程序的设计者来说这可是不得不想到的。程序员必须记住并查找每个函数名。而函数的重载把从这种问题的复杂性中解放了出来,C++提供了这种支持。上面的三个比较大小的函数可以定义成:
int Max (int,int); //返回两个整数的最大值;
int Max (const vector &int& &); //返回vector容器中的最大值;
int Max (const matrix &); //返回matrix引用的最大值;
通过参数就可以一眼分辨不同的函数。
同时函数的重载也有它不适用的情况。例如:在开发文本编辑器的过程中,会涉及到一系列控制的函数,如下:
Screen& MoveUp( );
Screen& MoveDown( );
Screen& MoveLeft( );
Screen& MoveRight( );
看过这四个函数不言而喻,它们是控制光标在上的位置的,即:向上移动光标,向下移动光标,向左移动光标,向右移动光标。如果我现在把它们写成重载函数,每个都是Screen& Move( );显然对于来说是不易理解的。因此对于的使用我们应遵循应用的逻辑,而不是简单地因为它的存在就必须使用它。程序员不应该勉强使用重载函数。
您有没有想过C++是如何判断您调用的是重载中的哪个函数?即使它们的函数名相同。您也许会毫不犹豫的回答:是通过函数的参数表。其实识别的过程并不是像您想象中的那么的容易,其中涉及到参数的等级划分,参数转换等诸多方面,下面我就一一进行讲解。
假如有下面一组函数:
voidS();
voidS(int);
voidS(double,double=1.2);
voidS(constchar*,constchar*);
voidMax(int,int);
intmain()
//S(2.4);的调用与S();S(int);S(double,double=1.2);S(constchar*,constchar*),的声明在同一域,即是可见的。
那么好,问题出现了。S (2.4 );将调用上面四个函数中的哪一个呢?
判断重载函数的第一步是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与同名的函数。上面的前四个函数都可以成为候选函数(当然可以是多个),而唯有Max ( int , int ) 被排除在外了。
判断重载函数的第二步分为两动作。第一个动作是从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同(如S ( int )),或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的(如 S (double , double =1.2 );)第二个动作是根据参数类型的转换规则将被调用的函数转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。上面的函数中只有两个是可行函数,它们分别是S ( int ); S ( double , double )。
如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有函数与调用匹配,属于无匹配情况(no match function)。
判断重载函数的第三步是从第二步中选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行函数。
新手上路我有疑问投诉建议参考资料 查看Linux下malloc/free与new/delete的区别
Linux下malloc/free与new/delete的区别,阅读Linux下malloc/free与new/delete的区别,由于malloc/free是库函数,不是运算符,他们不能执行构造函数和析构函数,只是负责分配内存。 1、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可
   
由于malloc/free是库函数,不是运算符,他们不能执行构造函数和析构函数,只是负责分配内存。
1、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2、对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3、因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4、C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存
new 是个操作符,和什么”+”,”-”,”=”…有一样的地位.malloc是个分配内存的函数,供你调用的.
new是保留字,不需要头文件支持.malloc需要头文件库函数支持.
new 建立的是一个对象,malloc分配的是一块内存.
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间。
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针。
(责任编辑:)
本文关键字:
广告赞助商
最新视频推荐
Copyright (C) 2007-, All Rights Reserved 版权所有 . 沪ICP备号
地址:上海徐汇区零陵路585号 爱邦大厦26H座
传真(FAX):021-
电话(Tel):021-
PHP100 Website Powered by PHPCMS. For PHP100. 服务器维护:阿里巴巴-阿里云问:拷贝构造函数和赋值运算符(=)有何不同?
[问题点数:0分]
问:拷贝构造函数和赋值运算符(=)有何不同?
[问题点数:0分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2005年8月 Linux/Unix社区大版内专家分月排行榜第三2005年6月 Linux/Unix社区大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 oc方法和函数的区别 的文章

 

随机推荐