z****e 发帖数: 2024 | 1 代码如下:
#include
using namespace std;
class Foo{
public:
Foo(){cout<<"ctr"<
void* operator new(size_t){
return pool;
}
private:
static char pool[ ];
};
char Foo::pool[sizeof(Foo)];
void* rbv(){
static char pool[sizeof(Foo)];
return pool;
}
int main(int argc, char* argv[]){
Foo *x=new Foo;//正确,输出 “ctr”
Foo *y=rbv();//错误:invalid conversion from ‘void*’ to ‘Foo*’
}
我就奇怪了,一样是返回一块内存,怎么必须是operator new()返回的就行?而一般
global函数返回的就不行呢? |
t****t 发帖数: 6806 | 2 new Foo has type Foo*
void* has type void*
void* can't be (implicitly) cast to Foo*
【在 z****e 的大作中提到】 : 代码如下: : #include : using namespace std; : class Foo{ : public: : Foo(){cout<<"ctr"<: void* operator new(size_t){ : return pool; : } : private:
|
X****r 发帖数: 3557 | 3 先忽略你重载的operator new,把基本概念搞清楚。
从语法上来讲,void*不能自动转换成Foo*,这个是乌龟的屁股,所以你编译通不过,
从语义上来讲,rbv只是返回一片内存,new不仅分配内存还调用构造函数,这个赋值就
不对。
如果你想在指定的内存位置构造一个对象,用placement new:
Foo *y = new (rbv()) Foo;
如果你想强行把这片空间作为一个Foo对象来看待,用cast:
Foo *y = (Foo *) rbv();
但是后者这样的话你使用y的时候什么都可能发生。
【在 z****e 的大作中提到】 : 代码如下: : #include : using namespace std; : class Foo{ : public: : Foo(){cout<<"ctr"<: void* operator new(size_t){ : return pool; : } : private:
|
X****r 发帖数: 3557 | 4 我就知道你一定比我快!
【在 t****t 的大作中提到】 : new Foo has type Foo* : void* has type void* : void* can't be (implicitly) cast to Foo*
|
z****e 发帖数: 2024 | 5 这个就是我百思不得其解所在。
1.new 我给重载了,也是返回一个 void*.和rbv一样的呀!
2.这个new,不就是一个普普通通的成员函数么?
我给他换个名字,就不行了?
是不是因为new是C++的一个保留字,所以,其重载以后的行为还有我所不能控制的地方?
【在 t****t 的大作中提到】 : new Foo has type Foo* : void* has type void* : void* can't be (implicitly) cast to Foo*
|
z****e 发帖数: 2024 | |
z****e 发帖数: 2024 | 7 哦,我好像明白了,就是说,这个new是C++保留字,它本身有很多幕后操作对吧?
所以对new的重载,并不是一个简单的定义就完了,我虽然给了new的定义,但是编译器
会自动加一些东西是吧?
而那个rbv(),由于不是保留字,就一个草民,我写的,就是它干的事情,没有幕后
的后台,所以就被“龟腚”了对吧?
【在 X****r 的大作中提到】 : 先忽略你重载的operator new,把基本概念搞清楚。 : 从语法上来讲,void*不能自动转换成Foo*,这个是乌龟的屁股,所以你编译通不过, : 从语义上来讲,rbv只是返回一片内存,new不仅分配内存还调用构造函数,这个赋值就 : 不对。 : 如果你想在指定的内存位置构造一个对象,用placement new: : Foo *y = new (rbv()) Foo; : 如果你想强行把这片空间作为一个Foo对象来看待,用cast: : Foo *y = (Foo *) rbv(); : 但是后者这样的话你使用y的时候什么都可能发生。
|
X****r 发帖数: 3557 | 8 你得到它了。你重载的operator new和你调用的new expression不是一回事。
【在 z****e 的大作中提到】 : 哦,我好像明白了,就是说,这个new是C++保留字,它本身有很多幕后操作对吧? : 所以对new的重载,并不是一个简单的定义就完了,我虽然给了new的定义,但是编译器 : 会自动加一些东西是吧? : 而那个rbv(),由于不是保留字,就一个草民,我写的,就是它干的事情,没有幕后 : 的后台,所以就被“龟腚”了对吧?
|
t****t 发帖数: 6806 | 9 (new Foo) is not equivalent to (Foo::operator new).
new Foo will do following:
call Foo::operator new(sizeof(Foo)). if not found, call ::operator new(
sizeof(Foo)). [5.3.4, 8]
then call Foo::Foo() for the allocated space.[5.3.4, 15].
then returns Foo*.
方?
【在 z****e 的大作中提到】 : 这个就是我百思不得其解所在。 : 1.new 我给重载了,也是返回一个 void*.和rbv一样的呀! : 2.这个new,不就是一个普普通通的成员函数么? : 我给他换个名字,就不行了? : 是不是因为new是C++的一个保留字,所以,其重载以后的行为还有我所不能控制的地方?
|
t****t 发帖数: 6806 | 10 因为你太能说了...
【在 X****r 的大作中提到】 : 我就知道你一定比我快!
|
|
|
X****r 发帖数: 3557 | 11 一般一般,第二轮你比较能说,就慢了,呵呵。
【在 t****t 的大作中提到】 : 因为你太能说了...
|
z****e 发帖数: 2024 | 12 大侠们的指点真是让我拨云见日啊!
多么愉快的一个周末呀。 |
z****e 发帖数: 2024 | |
z****e 发帖数: 2024 | 14 你这个英文已经达到了如火纯情的境界了呀,you got it,你就来个 “你得到它了。”
lol。
那要是 got you,就是 得到你了?
【在 X****r 的大作中提到】 : 你得到它了。你重载的operator new和你调用的new expression不是一回事。
|
g***j 发帖数: 1275 | 15 operator new is different from new operator
The new in new expression is new operator.
the new you override is operator new.
operator new is same as malloc, which returns void*.
【在 z****e 的大作中提到】 : 代码如下: : #include : using namespace std; : class Foo{ : public: : Foo(){cout<<"ctr"<: void* operator new(size_t){ : return pool; : } : private:
|