C++ 编译器默认构造函数奇怪问题

非常奇怪的问题,如下

struct MyType
{
public:
    int i;
    void* operator new(size_t size,void *p,int i)
    {
        ((MyType*)p)->i = i;
         return p;
    }
};
int main( )
{

    struct MyType ss;

    struct MyType *pss2= new (&ss,20) MyType();
    cout<<ss.i<<" "<<pss2->i;
    struct MyType *pss3= new (&ss,30) MyType;
    cout<<ss.i<<" "<<pss3->i;
}

按道理红色部分过程应该是一样的,都是先调用operator new然后调用编译器自动生成的默认构造函数。

但是编译出来 第一个输出0,0,第二个输出30,30.

也就是说带括号的版本会在operator new后会将对象的内存清0,而后一个则不会,因此后一个才能输出30,而前一个写入的20被清零了。

这个问题很奇怪,不知是何原因。

同样类似问题

struct MyType t1;

struct MyType t2 = MyType();

上面的t1中的i 没有被初始化,是一个随机值,而下面的t2是MyType()生成的一个临时对象的拷贝,按道理编译器默认生成的构造函数是不会初始化成员变量的(因此t1中的成员i 没有初始化),但是t2中的i 成员却被清0了。

相当疑惑ing

原文地址:https://www.cnblogs.com/absolute8511/p/1649561.html