读书人

C++的定位new有关问题

发布时间: 2012-09-24 13:49:42 作者: rapoo

C++的定位new问题
我有个问题想问问各位,在c++中的定位new的实现怎么理解,以下是定位new的代码
#ifndef __PLACEMENT_NEW_INLINE
#define __PLACEMENT_NEW_INLINE
inline void *__cdecl operator new(size_t, void *_P)
{
return (_P);
}
举个例子
#include <iostream>
#include <new>
using namespace std;
class A
{
public:
int a;
A()
{
a = 4;
}
A(int s)
{
a = s;
}
};
int main()
{
char *p = new char[10];
A *p1 = new (p) A(5);
//我认为这条语句之后接变成了A *p1 =(A *) p;因为定位new仅仅返回指针而已
//但是如果我用A *p1 =(A *) p;代替上面一条语句的话,输出为乱码
cout<<p1->a<<endl;
return 0;
}
这时候的结果就是5,但是为什么呢?我们知道定位是重载的new操作符,为什么return (_P);就可以完成了对p1对象的构造,
我要怎么理解定位new的实现,在C++对象模型一书中有提到过定位new问题,书中的解释是这样的
A *p1 = new (p) A(5); 相当于A *p1 =(A *) p; 而后在调用构造函数初始化p1所指向的对象
但是我的问题就是这里,从语法的角度来说A *p1 = new (p) A(5); 相当于A *p1 =(A *) p;
为什么返回一个指针就会调用该指针所指向对象的构造函数呢?这是那本书里写的?还是我理解的根本就错了,麻烦各位帮忙看看,非常感谢




[解决办法]

C/C++ code
class A{public:    int a;    A():a(4){}    A(int s):a(s){}};int main(){    char p[10];    A *q=new(p)A(5);    return 0;} 

读书人网 >C++

热点推荐