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

C++爱好者探讨一个有关问题,对于Person *p=new Person()是否会调用默认构造函数?

2013-07-04 
C++爱好者探讨一个问题,对于Person *pnew Person()是否会调用默认构造函数????按照C++primer 上所说Perso

C++爱好者探讨一个问题,对于Person *p=new Person()是否会调用默认构造函数????
按照C++primer 上所说Person *p=new Person()是会调用默认构造函数的,effective C++上也同样是这么认为,以下是effective C++的一段原话:C++爱好者探讨一个有关问题,对于Person *p=new Person()是否会调用默认构造函数?
但是按照inside C++上说,应该不会调用,以下来自inside C++:
C++爱好者探讨一个有关问题,对于Person *p=new Person()是否会调用默认构造函数?
C++爱好者探讨一个有关问题,对于Person *p=new Person()是否会调用默认构造函数?
我自己在VC.6.0下试了一下,从效果上看应该是没有调用,我不知道是不是编译器不同会有所不同。不知道大家什么观点?
[解决办法]

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

你理解错了inside C++中lippmen的语意。lippmen所说没有运行默认构造函数指的是对于trival construtor,编译器可以不产生实际的构造函数,因为是trival,不管有没有运行构造函数,从观察者的角度看来,结果都一样,所以才没有真正运行构造函数,这是实现语义。但在抽象语义上,构造函数是有运行的,这就是C++ primer的意思。

结论就是,inside C++这本书楼主白看了,没有理解到作者真正想教导你的东西。

你说的我明白,但是如果有以下代码

class Person{
public:
int age;
string name;

Person p1;
Person* pp1=new Person();
int main()
{
  Person p1;
  Person* pp2=new Person();
  return 0;
}

可以观察到 p1,p2,*pp1的值各有不同,如果按照inside C++所说编译器合成的默认构造函数是trival的,那么三者应该都调用了这个默认构造函数,但是结果却不同。如果说编译器在面对不同条件合成不同的默认构造函数,那么又是什么依据?难道同时trival构造函数 效果还不同吗?


你观察到的结果受到另一条规则:零初始化的影响,所以会有所不同。
不只是0的初始化,string的初始化也不同,这个很难以理解...

你是如何得出 string 的初始化不同的结论呢?
单步调试看一下各个对象string的值,对于Person p1;这种name=“”;说明调用的默认合成构造函数间接调用了string的默认构造函数。但是Person *p=new Person() 中的name是未初始化的.

如果这样的话,std::cout << p->name << std::endl; 会打印出随机的值,不如你看看能不能打印出除空字符串之外的值?
ps. debugger 也是会出错的,刚好这两天看到个例子,这帖子里 (http://bbs.csdn.net/topics/390492504 ) 楼主盯着调试器看,一直认为 sizeof(pRF) == 4,最后打印出来才发现其实为 112。看看,差多远。
[解决办法]
楼猪,你是没看清楚 inside C++中那个new是什么new,此new非彼new。你要分清楚:[new] [operator new][placement new]的区别 参看我的文章:http://hi.baidu.com/445920201/item/70a61f19508aedf865eabfd7

热点排行