首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否即使存在默认构造函数也未创建对象?

是的,即使存在默认构造函数,也不一定会创建对象。

默认构造函数是指在没有显式定义构造函数的情况下,编译器会自动生成的一个无参构造函数。它用于创建对象时进行初始化操作。

然而,并不是所有情况下都会创建对象。以下是一些情况:

  1. 静态成员:静态成员属于类本身,而不是对象。静态成员在程序运行时会被分配内存空间,但不需要创建对象来访问它们。
  2. 抽象类:抽象类是一种不能被实例化的类,它只能作为其他类的基类。因此,即使存在默认构造函数,也无法直接创建抽象类的对象。
  3. 单例模式:单例模式是一种设计模式,它限制一个类只能创建一个对象。在单例模式中,通常会定义一个静态方法来获取该类的唯一实例,而不是通过构造函数创建对象。
  4. 构造函数私有化:如果将类的构造函数声明为私有,外部无法直接创建对象。这种情况下,即使存在默认构造函数,也无法创建对象。

综上所述,即使存在默认构造函数,也未必会创建对象。具体是否创建对象取决于类的设计和使用方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

一.拷贝构造函数 A.概念 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建对象时由编译器自动调用。 B.特性 1....若显式定义,编译器会生成默认的拷贝构造函数默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。...我们发现自动生成的拷贝构造函数,让两个不同的对象中的 _arr 的地址相同,这样只要其中一个对象的 _arr 改变,另一个对象里的 _arr 会改变,这并不是我们想要的结果,而且同一个地址还会被析构两次... ,这就会崩溃,所以当有动态申请的资源时,要自己写拷贝构造函数; C.使用场景 1.使用已存在对象初始化新对象; class Date { public: Date(int year = 23, int...四.区分拷贝构造和赋值运算符重载 1.当我们用一个已经存在对象去初始化另一个对象时,即使写的是 “ = ” ,此时调用它的拷贝构造函数; 2.已经存在的两个对象之间赋值拷贝,此时是赋值运算符重载;

11310

认识初始化

赋值操作是使用默认的按位复制的方式或者是由重载operator=操作符来完成,而对象的初始化必须由构造函数来完成。...在以上String类的设计中,构造函数只需要根据传入的参数字符串的长度来分配空间就可以了,而赋值操作符重载函数则需要考虑传入的参数字符串的长度,然后决定是否要释放原来空间并申请新的空间。...可见,构造函数和赋值操作的逻辑也是有很大的差别。 C++中,基本类型的变量可以当做对象来处理,因此基本类型的变量可以采用类似默认构造函数的形式进行初始化。...如: (1)定义常变量,必须同时完成初始化; (2)由于引用本质是指针常量,所以定义引用时必须同时初始化; (3)定义构造类型的常对象时,相应的构造函数必须存在。...但是类A并没有显示定义参数为空的构造函数,而编译器并非在显示定义任何构造函数时一定为类合成默认构造函数即使合成了默认构造函数,对成员变量初始化的值也是随机的,没有意义的。

1.2K10

【C++修行之道】类和对象(三)拷贝构造函数

目录 一、 概念 二、特征 正确的拷贝构造函数写法: 拷贝函数的另一种写法 三、若显式定义,编译器会生成默认的拷贝构造函数。...深拷贝的写法: 五、拷贝构造函数典型调用场景: 六、总结: 一、 概念 在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。 那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?...拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建对象时由编译器自动调用。...拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。 若显式定义,编译器会生成默认的拷贝构造函数。...拷贝构造函数典型调用场景: 使用已存在对象创建对象 函数参数类型为类类型对象 函数返回值类型为类类型对象 class Date { public: Date(int year = 1900, int

6010

python模块之threading

该列表包含守护线程、current_thread()函数创建的哑线程,以及主线程,不包含已终止的线程和启动的线程。 threading.main_thread() 返回主线程对象。...标准的run()方法调用传入构造器的可调用对象target(存在的话),并使用args和kwargs分别作为target的位置参数和关键字参数。...多个线程可能名称相同,初始值由构造器设置。 ident 线程标识符,如果为None说明该线程启动。当一个线程退出,新的线程创建,线程标识符可能被回收使用。即使线程退出,该标识符仍可用。...主线程不是守护线程,因此在主线程中创建的线程daemon属性默认值为False CPython实现细节:在CPython中,由于GIL的原因,一次只有一个线程能够执行python代码(即使某些面向性能的库能克服这个限制...blocking:默认为True,在获取到锁之前阻塞线程;反之即使没有获取到锁不会阻塞线程。 timeout:指定线程阻塞的最长时间,单位为秒;-1表示无限制等待。

95240

JavaScript之手写call、apply、bind函数

手写call函数 实现步骤: 判断调用对象是否函数即使我们是定义在函数的原型上的,但是可能出现使用call等方式调用的情况 判断传入上下文对象是否存在,如果不存在,则设置为window 处理传入的参数...,如果传入则设置为window context=context||window; //将调用函数设为对象的方法 context.fn=this; //调用函数...,如果传入则设置为window context=context||window; //将调用函数设为对象的方法 context.fn=this; //调用函数...实现步骤: 判断调用对象是否函数即使我们是定义在函数的原型上的,但是可能出现使用call等方式调用的情况 保存当前函数的引用,获取其余传入参数值 创建一个函数返回 函数内部使用apply来绑定函数调用...,需要判断函数作为构造函数的情况,这个时候需要传入当前函数的this给apply调用,其余情况都传入指定的上下文对象 Function.prototype.myBind=function(context

28060

【C++】类与对象理解和学习(中)

接下来我们先谈一谈它的创建规则 构造函数函数名与类名相同 无返回值 对象实例化时编译器自动调用对应的构造函数。...一个类只能有一个析构函数。若显式定义,系统会自动生成默认的析构函数。...注意:析构函数不能重载(只能存在一个,要么是编译器自动生成的,要么是自己写的) 对象生命周期结束时,C++编译系统系统自动调用析构函数 当然,在析构函数这里存在着一个大坑,与默认构造函数相同...,拷贝构造是给实例化对象初始化,此时实例化对象还没有创建完成,但赋值是两个都已经实例化后的对象,a的值赋值给b,b=a,此时a与b都是以及实例化后的。...这里我们还需要注意的就是,它是祖师爷钦点的天选之子之一 ,所以即使我们不写,编译器会生成一个默认赋值运算符重载,但是,我们 写的话只能在类内写,不可以写在全局,这是因为如果类中没有赋值运算符,

51630

java面试强基(5)

对象存在于堆内存,局部变量则存在于栈内存。 生存时间 :从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象创建存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。...默认值 :从变量是否默认值来看,成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量必须显式地赋值),而局部变量则不会自动赋值。...因为一个类即使没有声明构造方法会有默认的不带参数的构造方法。 public v(){ } 如果我们自己添加了类的构造方法(无论是否有参),Java 就不会再添加默认的无参数的构造方法了。...构造方法有哪些特点?是否可被 override? 构造方法特点如下: 名字与类名相同。 没有返回值,但不能用 void 声明构造函数。 生成类的对象时自动执行,无需调用。...每一个类必须有自己的构造函数,在创建对象时自动调用,如果添加有参构造函数后,默认无参构造函数则被覆盖。子类不会覆盖父类的构造函数,但是在创建子类对象的时候,会自动调用父类构造函数

32430

c++IO库之文件输入输出详细整理,建议赶紧收藏!!!

---- fstream的特有的操作 fstream fstrm 创建一个绑定的文件流。...这些构造函数是explicit的。...默认的文件模式mode依赖于fstream的类型 fstream fstrm(s,mode) 与前一个构造函数相似,但按指定mode打开文件 fstrm.open(s) 打开名为s的文件,并将文件与fstrm...每个文件流都定义了一个名为open的成员函数,它完成一些系统相关的操作,来定位给定的文件,并视情况打开为读或写模式。 创建文件流对象时,我们可以提供文件名(可选的)。...没被设定,就可以设定app模式,在app模式下,即使没有显示指定out模式,文件总是以输出方式被打开 默认情况下,即使我们没有指定trunc,以out模式打开的文件会被截断。

65220

JDK源码解析之 Java.lang.Object

其中A即是类名,A(args…)即此类定义中相对应的构造函数。通过此种形式创建对象都是通过类中的构造函数完成。...为体现此特性,Java中规定:在类定义过程中,对于未定义构造函数的类,默认会有一个无参数的构造函数,作为所有类的基类,Object类自然要反映出此特性,在源码中,给出Object类构造函数定义,但实际上...,此构造函数存在的。...当然,并不是所有的类都是通过此种方式去构建,自然的,并不是所有的类构造函数都是public。...以集合类中,以Set为例,当新加一个对象时,需要判断现有集合中是否已经存在与此对象相等的对象,如果没有hashCode()方法,需要将Set进行一次遍历,并逐一用equals()方法判断两个对象是否相等

38131

金九银十前端面试题总结(附答案)

实现call、apply 及 bind 函数(1)call 函数的实现步骤:判断调用对象是否函数即使是定义在函数的原型上的,但是可能出现使用 call 等方式调用的情况。...判断传入上下文对象是否存在,如果不存在,则设置为 window 。处理传入的参数,截取第一个参数后的所有参数。将函数作为上下文对象的一个属性。使用上下文对象来调用这个方法,并保存返回结果。...判断传入上下文对象是否存在,如果不存在,则设置为 window 。将函数作为上下文对象的一个属性。判断参数值是否传入使用上下文对象来调用这个方法,并保存返回结果。...:判断调用对象是否函数即使是定义在函数的原型上的,但是可能出现使用 call 等方式调用的情况。...优点是可以在子类构造函数中向父类构造函数传参。它存在的问题是:1)由于方法必须在构造函数中定义,因此方法不能重用。2)子类不能访问父类原型上定义的方法。

73440

【C++修行之道】类和对象(二)类的6个默认成员函数构造函数、析构函数

2.2 特性 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。 其特征如下: 函数名与类名相同。 无返回值。...,返回一个日期类型的对象 // warning C4930: “Date d3(void)”: 调用原型函数(是否是有意用变量定义的?)...这是因为C++的语法允许这样的歧义,而且函数声明的优先级高于对象定义。因此,即使你本意是想创建一个对象,编译器会将其视为一个函数声明。为了避免这种歧义,最好不要在对象定义时使用空括号。...确保成员变量的正确初始化:自动生成的构造函数会调用成员变量的默认构造函数,确保 MyQueue 中的两个 Stack 对象在 MyQueue 对象创建时被正确初始化。...关于编译器自动生成的析构函数是否会完成一些事情呢?下面的程序我们会看到,编译器生成的默认析构函数,对自定类型成员调用它的析构函数

6110

C++构造函数的作用_c++什么是构造函数

(因为已经有了一个构造函数,编译器就不会自动生成默认构造函数,于是 Complex 类就不存在默认构造函数) Complex c2(2); //正确,相当于 Complex c2(2, 0) Complex...可是 Complex 类已经有了一个构造函数,编译器就不会自动生成默认构造函数,于是 Complex 类就不存在默认构造函数,所以上述两条语句就无法完成对象的初始化,导致编译时报错。...构造函数必须是 public 属性的,否则创建对象时无法调用。当然,设置为 private、protected 属性不会报错,但是没有意义。...构造函数没有返回值,因为没有变量来接收返回值,即使毫无用处,这意味着: 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 不允许; 函数体中不能有 return 语句。...默认构造函数 如果用户自己没有定义构造函数,那么编译器会自动生成一个默认构造函数,只是这个构造函数函数体是空的,也没有形参,不执行任何操作。

1.4K20

Spring Data Commons对象映射基础

对象创建内部 为了避免反射的开销,Spring Data 对象创建默认使用运行时生成的工厂类,它会直接调用域类构造函数。...如果属性是不可变的,我们将使用持久性操作(请参阅对象创建)使用的构造函数创建实例的副本。 默认情况下,我们直接设置字段值。...即使意图是计算应该是首选,重要的是此构造函数将age作为参数(可能会忽略它),否则属性填充步骤将尝试设置年龄字段并由于它不可变且没有with…方法而失败在场。...提供一个全参数构造函数 ——即使你不能或不想将你的实体建模为不可变值,提供一个将实体的所有属性(包括可变属性)作为参数的构造函数仍然是有价值的,因为这允许对象映射以跳过属性填充以获得最佳性能。...当 Spring Data 检测到具有参数默认值的构造函数时,如果数据存储不提供值(或简单地返回null),它就会使这些参数不存在,因此 Kotlin 可以应用参数默认值。

1.4K40

JavaScript中的类型检查有点麻烦

在某场景下,变量值可能需要指定为 null,下面是一些场景: 可以使用null来跳过指示配置对象 使用null初始化稍后要保存对象的变量 当函数由于某种原因无法构造对象时,返回null 例如,如果不存在正则表达式匹配项...逻辑操作符||用作访问属性的默认情况,当属性存在且具有虚值时,该操作符无法正确工作。 若要在属性不存在默认设置,更好的选择是使用新的双问号(??)...5.instanceof 和原型链 JS 中的每个对象都引用一个特殊的函数:对象构造函数。...instanceof操作符通过整个原型链搜索对象构造函数。...要准确地检测创建对象构造函数,需要检测 constructor 属性 myCat.constructor === Cat; // => true myCat.constructor === Pet

1.4K10

【Django】QuerySet以及Pickle 序列化在Django中的深度运用详解

QuerySet QuerySet本身可以在不访问数据库的情况下构造、过滤、切片或复制和分配。只需要在需要从数据库检索数据或将数据保存到数据库时访问数据库。...还要注意,即使执行的QuerySet进行切片并返回另一个执行的Query Set,不允许对其进行进一步修改(例如,添加更多筛选器或修改排序),因为它无法很好地转换为SQL,也没有明确的含义。...annotation()的每个参数都是一个注释,将添加到返回的QuerySet中的每个对象。 Django提供的聚合函数在以下聚合函数中进行了描述。...pub_date', 'headline') Entry.objects.order_by(Coalesce('summary', 'headline').desc()) 如果不想在查询中应用任何排序,即使默认排序...,可以在不带参数的情况下调用order() 可以检查QuerySet有序属性确定查询是否排序。

1.7K10

【c++】类与对象(中)

构造函数是特殊的成员函数,主要任务并不是开 空间创建对象,而是初始化对象。 如果在类中并没有显示定译构造函数,编译器会默认生成一个 无参的默认构造函数。...d3函数,该函数无参,返回一个日期类型的对象 // warning C4930: “Date d3(void)”: 调用原型函数(是否是有意用变量定义的?)...注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数 4拷贝构造函数 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型...若显式定义,编译器会生成默认的拷贝构造函数默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。 4.1什么时候需要自己写拷贝构造函数?...4.2常见的拷贝构造函数调用场景 使用已存在对象创建对象 函数参数类型为类类型对象 函数返回值类型为类类型对象 class Date { public: Date(int year, int

11810

C++ 类使用规范建议

提供默认构造函数的原因是:如果你没有提供其他构造函数,又没有定义默认构造函数,编译器将为你自动生成一个,编译器生成的构造函数并不会对对象进行初始化。...它的生存周期受到了CCar对象的影响,m_engine将在CCar对象的生存周期中一直存在。如果CEngine发生了变化,那么CCar必须重新编译。...相较于上面的“嵌入对象”方式,优点是类CCar不再依赖于CEngine的大小。同时,即使CEngine的实现发生了变化,CCar不需要重新编译。...但是由于m_engine必须绑定到一个现存的CEngine对象上,也就是说,在实际应用中,构造CCar之前,我们必须保证合法的CEngine对象存在,不管后来是否用到它。...首先,在构造时,可以将m_pEngine置为NULL。在需要使用m_pEngine的时候,判断其是否为NULL。如果是,则创建一个新的CEngine对象。这就满足了我们按需创建的要求(惰性原则)。

1.7K20

C++奇迹之旅:深入思考拷贝构造函数

拷贝构造函数 概念 在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。 那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?...拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建对象时由编译器自动调用。...上面是引用拷贝构造函数,如果改为传值会发生无穷递归调用,因为传值传参会调用一个新的拷贝构造 浅拷贝(值拷贝) 若显式定义,编译器会生成默认的拷贝构造函数。...创建另一个 Date 类型的对象 d2,使用 d1 对象进行拷贝构造。由于 Date 类没有显式定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。...即使对象的动态内存被释放或修改,拷贝对象不会受到影响。 深拷贝需要自定义拷贝构造函数和赋值运算符,手动分配和复制动态内存。这样可以确保对象之间的独立性。

9110

C++知识概要

这个过程分为两步,第一步执行operator new()函数,在堆中搜索一块内存并进行分配;第二步调用类构造函数构造对象 什么情况会自动生成默认构造函数 带有默认构造函数的类成员对象 带有默认构造函数的基类...带有一个虚函数的类 带有一个虚基类的类 合成的默认构造函数中,只有基类子对象和成员类对象会被初始化。...因为 C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候会自动调用析构函数。...对象创建的时候要自动执行构造函数,消亡之前要调用析构函数。...即使你并没有写 this 指针,编译器在链接时会加上 this 的,对各成员的访问都是通过 this 的。

1.1K20
领券