调用构造函数而不创建对象

Posted

技术标签:

【中文标题】调用构造函数而不创建对象【英文标题】:Calling a constructor without creating object 【发布时间】:2013-09-19 10:18:31 【问题描述】:

下面的代码到底发生了什么。

#include<iostream.h>

class Demo

    public :

    Demo()
    
        cout<<"\nIn Demo const";
    
    ~Demo()
    
        cout<<"\nin demo dest";
    
;

void main() 
    Demo();

Demo() 只是调用构造函数和析构函数。在此过程中是否正在创建对象?那么内存分配了吗?

【问题讨论】:

【参考方案1】:

您没有显式调用构造函数,而是此代码创建了一个类型为Demo 的临时未命名对象,该对象在; 之后立即被销毁。

是的,内存已为该临时对象分配(自动在堆栈上),并在; 之后被释放(再次自动)。同时,构造函数和析构函数按预期被调用。

【讨论】:

开始挑剔:在这个例子中,对象没有任何成员,也不涉及继承。因此,该对象不需要堆栈上的任何空间。至少,任何理智的编译器都会将其优化为普通的函数调用。 @KirilKorov:不,sizeof 永远不能为零。但大多数编译器实际上不会为临时无数据对象使用任何存储空间,这符合“as-if”规则。 我要补充一点,(1)分配(很可能)不会消耗任何 CPU 时间,因为在分配/解除分配期间没有执行任何实际操作(编译器只是在堆栈帧)和(2)理论上,即使分配(内存预留)也可能由于“好像规则”而被优化 @KirilKirov 感谢有关 sizeof 的信息,不知道。 这是对的,但更奇怪的是:在语法上,你不能自己调用​​构造函数。您只能创建对象,并且在创建对象后,构造函数将自动被调用。【参考方案2】:

是的,内存已分配但在堆栈上,Demo() 正在创建一个自动销毁的临时对象。

【讨论】:

以上是关于调用构造函数而不创建对象的主要内容,如果未能解决你的问题,请参考以下文章

在 php 中调用类方法(带构造函数)而不实例化对象

C ++,是不是可以直接调用构造函数,而不需要new?

如何通过使用自定义构造函数而不调用析构函数来创建具有初始大小的向量? [复制]

如何在 Java 中从另一个构造函数调用一个构造函数?

为啥 sql 数据库不允许为所有查询创建函数而不是在调用程序中构造 sql 字符串?

构造函数为什么不能为虚函数