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

  • 相关阅读:
    微信小程序 数据绑定方式
    wxss与rpx
    Ubuntu 编译安装 Xdebug
    PHP运算符优先级
    有了art-template,如有神助
    laydate控制之前的日期不可选择
    label和span的区别
    phpredis基本操作
    FILE,id不一致
    双层保障,年龄的输入
  • 原文地址:https://www.cnblogs.com/absolute8511/p/1649561.html
Copyright © 2011-2022 走看看