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

  • 相关阅读:
    JS——jquery UI
    js——正则表达式
    jsonp——使用公共接口获取数据
    JS——json、ajax、jsonp
    [HNOI2011]括号修复 / [JSOI2011]括号序列
    [HNOI 2016] 树
    luogu_P3313 [SDOI2014]旅行
    无旋Treap模板
    [CF 718C] Sasha and Array
    [洛谷 P4556] 雨天的尾巴
  • 原文地址:https://www.cnblogs.com/absolute8511/p/1649561.html
Copyright © 2011-2022 走看看