在c++中,运算符和函数有什么区别?
⾸先看下运算符的定义:
函数类型 operator 运算符(形参表)
{
函数体;
{
譬如++运算符的重载为:
class lei{
friend lei operator++(const lei& );
}
调⽤的时候
lei entity = lei();
entity++;
这⾥⾯当我们调⽤entity++的时候,编译器⾃动的为我们⽣成operator++(entity)。
csdn上有⼀篇针对运算符和函数的区别的解答,觉得有⼀定道理:
1. 语法形式上有区别
2. 运算符只能重载,不能⾃定义,函数的名字随便起,只要是个标识符就⾏;但运算符不⾏,⽐如,你⽆法仿照其他语⾔的符号,⾃定义⼀个乘
法运算符“”**“”
3. 任何函数都可以重载或者覆盖,但通常你不能改变运算符作⽤于内置类型的⾏为,⽐如你不能通过重载"operator+",让3+2产⽣6.
其实总结来看,运算符本质上也是函数。只是运算符是编译器需要进⾏进⼀步解释。⽽函数是直接调⽤。
new\delete 与 malloc\free区别
new/\delete是运算符,malloc\free是函数。因此我们可以重载new运算符。
molloc函数new会⾃动的调⽤类的构造函数,会抛出异常,malloc只是负责分配内存,⽆法定义malloc失败时的默认⾏为,但你可以定义new失败时的默认⾏为,⽐如让它不抛出异常。
new和malloc返回的类型不⼀样。new 返回的是该类型的指针,malloc返回的是void*指针。
重载new\delete
运算符是语⾔⾃⾝的特性,它有固定的语义,⽽且编译器也知道意味着什么。就像 +-*/ ⼀样,由编译器解释语义,⽣成相应的代码。
库函数是依赖于库的,没有库就没有它,也就是⼀定程度上独⽴于语⾔的。理论上,编译器不知道也不关⼼函数的作⽤,编译器只保证编译函数,以及调⽤该函数时参数和返回值符合语法,并⽣成相应 call 函数的代码。但实际中⼀些⾼级点的编译器,都会对标准库⾃带的⼀些函数进⾏特别处理。
malloc与free是C++/C语⾔的标准库函数,new/delete是C++的运算符。对于⾮内部数据类型的对象⽽⾔,光⽤malloc/free ⽆法满⾜动态对象的要求。
对象在创建的同时要⾃动执⾏构造函数,对象消亡之前要⾃动执⾏析构函数。由于malloc/free是库函数⽽不是运算符,不在编译器控制权限之内,不能把执⾏构造函数和析构函数的任务强加于malloc/free。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论