在线等 C++ 解惑

baobaodediaozhui 2012-10-12 12:33:08
#include "stdafx.h"
#include <iostream>
using namespace std;
struct S{
void *operator new(unsigned int size,void *p,int i)
{
((S*)p)->i = i;
return p;
}
int i;
};
S ss;
S *pss = new(&ss,10)S();

int main()
{
cout << ss.i << " " << pss->i << endl;
S *pss2 = new(&ss,20)S();//加了()就是0,不加就是20 为什么?
cout << ss.i << " " << pss2->i << endl;
getchar();
return 0;
}
问题:
在S *pss = new(&ss,10)S();
和S *pss2 = new(&ss,20)S();
这两句中,如果S后面不加()则就是穿进去的数字,但加了后就是0了。但是但不调试时发现确实进了new函数,i的值也改变了,但执行完后,如果加了(),i又变成0了

在线等,一直没搞懂S后加()和不加的区别!
谢谢!
...全文
208 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
baobaodediaozhui 2012-10-12
  • 打赏
  • 举报
回复
这两句中,如果S后面不加()则就是传进去的数字,但加了后就是0了。但是单步调试时发现确实进了new函数,i的值也改变了,但执行完后,如果加了(),i又变成0了


感觉自己这么长时间的C++白学了,泪奔啊!!!!
mujiok2003 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 4 楼 的回复:
使用 () 形式的初始值设定项构造的 POD 类型的对象将被默认初始化

我昨晚验证得出的结果也是这个,能解释下神马叫POD么?还有默认初始化就是初始化为0?

不使用()则就不默认初始化了?就是随即值???
[/Quote]

有个简单办法判断一个类型是不是POD类型: 可以作为 union成员的类型一定是POD类型。
mujiok2003 2012-10-12
  • 打赏
  • 举报
回复
好问题! 对于POD类型,没有构造函数.
new S;//只分配空间
new S(); //分配空间后,把每个成员初始化为默认值(int-〉0, bool->false等)
对于非POD类型, "new S;" 和 "new S();" 一样,先分配空间,在调用默认构造函数

另: 1. operator new 只管分配内存空间,不要做初始化。正如你的例子所示,在new中的修改被之后的初始化覆盖了。
2. operator new 一定是static的.关键字static可以省略,最好写上。
baobaodediaozhui 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
使用 () 形式的初始值设定项构造的 POD 类型的对象将被默认初始化
[/Quote]
我昨晚验证得出的结果也是这个,能解释下神马叫POD么?还有默认初始化就是初始化为0?

不使用()则就不默认初始化了?就是随即值???
iamnobody 2012-10-12
  • 打赏
  • 举报
回复
operator new() 是内存分配函数, 在里面修改这段内存是没有意义的.

后面的 S 不加括号时,该对象会被默认初始化,其值不确定, 不可以读!
加括号时, 该对象会被 0 初始化. 里面的i 被初始化为0 .
fayn86 2012-10-12
  • 打赏
  • 举报
回复
时刻注意指针
zmzkkk 2012-10-12
  • 打赏
  • 举报
回复
楼主学 C++ 多久了呀!? [Quote=引用 1 楼 的回复:]

这两句中,如果S后面不加()则就是传进去的数字,但加了后就是0了。但是单步调试时发现确实进了new函数,i的值也改变了,但执行完后,如果加了(),i又变成0了


感觉自己这么长时间的C++白学了,泪奔啊!!!!
[/Quote]
漫步者、 2012-10-12
  • 打赏
  • 举报
回复
使用 () 形式的初始值设定项构造的 POD 类型的对象将被默认初始化
漫步者、 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

这两句中,如果S后面不加()则就是传进去的数字,但加了后就是0了。但是单步调试时发现确实进了new函数,i的值也改变了,但执行完后,如果加了(),i又变成0了


感觉自己这么长时间的C++白学了,泪奔啊!!!!
[/Quote]
加与不加一样,都是指向函数地址,这个你应该懂得。
_暮落_ 2012-10-12
  • 打赏
  • 举报
回复
S *pss2 = new(&ss,20)S();
加了之后 *pss2 指针的指向就变了。

64,632

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧