首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

new是单目运算符吧。替什么类内重载的new运算符函数有一个形参

2014-01-09 
new是单目运算符吧。为什么类内重载的new运算符函数有一个形参?class A{public:void* operator new(size_t

new是单目运算符吧。为什么类内重载的new运算符函数有一个形参?
class A
{
public:
   void* operator new(size_t size)
   {
       printf("operator new called/n");
       return ::operator new(size);
   }
};

类内的单目运算符重载不是应该不带参数吗?
::operator new(size);这个是调用的全局的new函数吗?需要头文件吗?
[解决办法]
new和delete的重载情况还是很复杂滴
它们分为new/delete([]) operator, operator new/delete([])
其中 new/delete([]) operator不允许重载,operator new/delete([])可以重载,返回值必须是void *
第一个参数必须是size_t,另外还可以追加任意多任意类型参数。事实上使用时,你是不需要显式提供第一个size_t类型的参数的,但后面的参数需要显式提供。
operator new有个特殊的版本,叫placement new,它其实就是
void *operator new(size_t size, void *p)版本的operator new,它就是在指定的地址p上构造对象,而不重新分配内存。
[解决办法]
不知道说啥好了。
反正,楼主,还是找effective c++啃吧。
网上的言论误导比正导多的。
[解决办法]

引用:
Quote: 引用:

new和delete的重载情况还是很复杂滴
它们分为new/delete([]) operator, operator new/delete([])
其中 new/delete([]) operator不允许重载,operator new/delete([])可以重载,返回值必须是void *
第一个参数必须是size_t,另外还可以追加任意多任意类型参数。事实上使用时,你是不需要显式提供第一个size_t类型的参数的,但后面的参数需要显式提供。
operator new有个特殊的版本,叫placement new,它其实就是
void *operator new(size_t size, void *p)版本的operator new,它就是在指定的地址p上构造对象,而不重新分配内存。


没看到过new delete运算符不能重载的说法。
你说的operator new/delete([])在C++语法中对应什么概念?是函数吗


引用:
Quote: 引用:

new和delete的重载情况还是很复杂滴
它们分为new/delete([]) operator, operator new/delete([])
其中 new/delete([]) operator不允许重载,operator new/delete([])可以重载,返回值必须是void *
第一个参数必须是size_t,另外还可以追加任意多任意类型参数。事实上使用时,你是不需要显式提供第一个size_t类型的参数的,但后面的参数需要显式提供。
operator new有个特殊的版本,叫placement new,它其实就是
void *operator new(size_t size, void *p)版本的operator new,它就是在指定的地址p上构造对象,而不重新分配内存。


没看到过new delete运算符不能重载的说法。
你说的operator new/delete([])在C++语法中对应什么概念?是函数吗


operator new
operator new[]
operator delete
operator delete[]
[解决办法]
首先应该了解什么是new operator,什么是operator new, placement new。

new operator 是编译器内置的操作符,就像 + - * / 这些操作符一样,但是
当编译器发现是这些操作符之后肯定会执行一些操作,当看到new 后执行什么呢?
如果不重写operator new,就会调用全局的::operator new(size);
如果在类里面重写了,就会执行重写的。
[解决办法]
引用:
Quote: 引用:

首先应该了解什么是new operator,什么是operator new, placement new。

new operator 是编译器内置的操作符,就像 + - * / 这些操作符一样,但是
当编译器发现是这些操作符之后肯定会执行一些操作,当看到new 后执行什么呢?
如果不重写operator new,就会调用全局的::operator new(size);
如果在类里面重写了,就会执行重写的。


嗯。这个我也看明白了。
但是对于别的运算符的重载函数,其形参类型都就是运算符的操作数类型。但是new运算符重载函数的形参类型就不是其运算符的操作数类型了。这个该怎么理解?是不是这个根本就不能叫做重载?


说明你还是没明白
new operator就是你一般用的new,但不允许你重载,operator new是被new operator所调用,用来做实际内存分配操作的,这个是可以重载的,这个东西的第一个参数size就是new operator传给它的要分配的大小。具体这个size怎么弄出来的不关你事,你只管分配足够空间就行了
细节是不是这样我不清楚,但你这样理解也不会出错就行了

热点排行