调用构造函数与新重载之间的区别是什么?

时间:2016-03-04 19:45:12

标签: c++ qt operator-overloading constructor-overloading

考虑下面的代码,当我致电new(name, 10) Foo()时,我希望按顺序发生以下情况:

  1. void* operator new(std::size_t size, QString name, int id)重载被称为
  2. 从上面的重载调用的
  3. Foo(QString name, int id)构造函数 在这个时候,我的课程分配了足够的内存,所以我可以放心地设置:

    name(name),id(id)

  4. 调用Foo()空构造函数,什么都不做。只有在这里因为必须实施。

  5. 但是我错过了一些东西。成员名称值为空。有人会解释什么以及如何解决?

    代码:

    注意:QString是Qt' QString类型

    class Foo
    {
    public:
        QString name;
        int id;
    
        // The idea is return an already existing instance of a class with same values that
        // we are going to construct here.
        void* operator new(std::size_t size, QString name, int id)
        {
            Foo *f = getExistingInstance(name, id);
    
            if(f != NULL)
                return f;
    
            /* call to constructor Foo(QString, int) is an alias for:
             *      Foo* *p = static_cast<Foo*>(operator new(size));
             *      p->name = name;
             *      p->id = id;
             *      return p;
             * I don't think it's wrong on ambiguos in the below call to constructor, since it does use
             * operator new(std::size_t size) and Foo(QString name, int id) "methods"
             */
            return new Foo(name, id);
        }
    
        void* operator new(std::size_t size)
        {
            void *ptr = malloc(size);
            assert(ptr);
            return ptr;
        }
    
        Foo(QString name, int id)
            : name(name),
              id(id)
        {
    
        }
    
        Foo()
        {
    
        }
    
        ~Foo()
        {
    
        }
    
        QString toString()
        {
            return QString("name = %1, id = %2")
                    .arg(name)
                    .arg(id);
        }
    
        static Foo* getExistingInstance(QString name, int id)
        {
            /* not implemented yet */
            return NULL;
        }
    };
    

    我怎么称呼它:

     QString name = "BILL";
     Foo *f = new(name, 10) Foo();
     qDebug() << f->toString(); //output "name = , id = 10"
     delete f;
    

1 个答案:

答案 0 :(得分:0)

Foo *f = new (name, 10) Foo; 使用重载的ǹew运算符分配内存,然后使用默认构造的Foo初始化内存(由于name不是id而只覆盖id但不覆盖qDebug() << __PRETTY_FUNCTION__;在defualt构造函数中初始化。)

您可以通过以下方式查看:在Foo的构造函数中decimal

有关类似问题,请参阅SO