zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    pair和map
    lower_bound( )和upper_bound( )
    P1886 滑动窗口 /【模板】单调队列
    数的度(数位dp)
    最小生成树
    刷题-力扣-1052. 爱生气的书店老板
    刷题-力扣-766. 托普利茨矩阵
    刷题-力扣-28. 实现 strStr()
    刷题-力扣-697. 数组的度
    刷题-力扣-1004. 最大连续1的个数 III
  • 原文地址:https://www.cnblogs.com/absolute8511/p/1649561.html
Copyright © 2011-2022 走看看