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

当我在构造函数中创建线程时,为什么实例化一个对象和一个对象指针的行为不同?

在构造函数中创建线程时,实例化一个对象和一个对象指针的行为是不同的。下面是它们的具体区别:

  1. 实例化一个对象: 当在构造函数中直接实例化一个对象时,线程会在对象的生命周期内运行,并且在对象销毁时自动终止。这意味着线程的生命周期与对象的生命周期紧密相连。
  2. 实例化一个对象指针: 当在构造函数中创建一个对象指针时,线程会在指针所指向的对象的生命周期内运行。然而,由于指针可以在对象销毁之后仍然存在,线程可能会继续运行,导致悬空引用或野指针错误。因此,在使用对象指针创建线程时,需要确保在线程结束之前,对象的生命周期依然存在。

为了避免悬空引用或野指针错误,可以采取以下措施:

  • 在线程结束之前,确保对象的生命周期依然存在。
  • 使用智能指针来管理对象的生命周期,例如std::shared_ptr或std::unique_ptr,以确保线程运行期间对象不会被提前销毁。
  • 在线程执行期间使用适当的同步机制来保护对象的访问,例如互斥锁(std::mutex)或原子操作(std::atomic)。

总结:当在构造函数中创建线程时,实例化一个对象和一个对象指针的行为不同,对象指针需要特别小心处理以避免悬空引用或野指针错误。

相关搜索:在构造函数中或在类的顶部创建一个对象我们初始化主对象,然后它在其构造函数中创建一个新对象。当我们销毁主对象时,它的创建会发生什么?当我们将一个整数值赋给一个类的对象时,为什么调用参数化的构造函数?当我们实例化一个对象时,python中的类变量是否表现为实例变量?React js,在构造函数中为对象分配一个键的行为很奇怪。当我试图在它自己的类中创建一个对象时,为什么它会显示stackoverflowerror?为什么当类在一个函数中时,类中的全局函数会有不同的行为?我正试图在我的Playstate中创建一个对象AllBalls,但是当我试图初始化对象时,我得到了一个错误当一个类的实例本身被创建时,为什么构造函数中的语句不被执行呢?如何在另一个类中创建一个读取文件的构造函数,然后在main方法中实例化它?当我们有两个具有相同属性的类时,如何在Java中为参数化构造函数创建对象?如何在Typescript中创建一个可以使用对象或常规参数构造函数进行初始化的类?使用构造函数创建类对象的数组时出现问题,然后我想在C++中向对象添加另一个值在哪种情况下,我们必须使用这些对象文字、构造函数和Object.create()中的一个,以及它们之间有何不同?在angular中,如何在单击按钮时将id和对象从一个组件传递到另一个组件的函数?当我在C++中派生一个类时,它是否创建了一个基类对象并将其作为我的成员变量存储在派生类中?在使用函数和for循环时,如果存在重复或相似的值,如何返回对象中的第一个匹配值?每当我尝试调用我在另一个react本机应用程序中创建的ReactNativeLibrary时,我都会收到“未定义的不是对象”的消息我需要创建一个发送电子邮件的函数,为什么当我在main中调用它以确认它是否已发送时,它显示为null?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 )

一、在不同的内存中创建类的实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) 中 , 介绍了 三种类型的 构造函数 , 并在 main 函数中 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 类实例对象 , 最终将实例对象赋值给了..., 会自动将栈内存中的实例对象销毁 ; 栈内存中 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ; 2、堆内存中创建实例对象 在 栈内存 中声明 类 的 实例对象 方式是 : 该 s1...实例对象存放在栈内存中 , 会占用很大块的栈内存空间 ; Student s1; 在 堆内存 中声明 类 的 实例对象 方式是 : 该 s2 实例对象是存放在堆内存中的 , 栈内存中只占 4 字节的指针变量大小...; Student* s2; 在 C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码中 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数

18820

2020最全Java面试题--基础篇

堆:堆创建了一个运行时,它包含在其中分配对象的运行时数据区域。 栈:栈在运行时存储局部变量和部分结果。 它还有助于方法调用和返回值。 每个线程在创建线程时都会创建一个私有JVM栈。...Java中的默认构造器返回的值是什么? 当我们用Java调用构造函数时,它返回由它创建的对象。 这就是我们用Java创建新对象的方式。 7. 我们能继承构造函数吗?...但是,当使用new关键字时,将隐式调用构造函数。 因此,它需要一个body。 如果我们将方法设置为static,则意味着它属于该类,但不属于特定对象。 始终调用构造函数来初始化对象。...8.如果Java中没有指针,那为什么我们会得到NullPointerException? 在Java中,指针是等同于对象引用。 当我们使用。 它指向对象的引用。...Object.clone()方法用于在Java中创建对象的完全拷贝。 它的行为就像复制一个构造函数。 它创建并返回对象的副本,该对象具有相同的类,并且所有字段的值与原始对象的值相同。

58331
  • Java面试基本问题

    请参考下图,该图显示了不同的原始类型,包装器类和构造函数参数。 Q6。Java中的构造函数是什么? 在Java中,构造函数是指用于初始化对象的代码块。它必须与该类具有相同的名称。...换句话说,默认构造函数是无参数构造函数,如果用户没有定义其他构造函数,则默认情况下将创建该构造函数。其主要目的是用默认值初始化实例变量。而且,它主要用于对象创建。...参数化构造函数: Java中的参数化构造函数是能够使用提供的值初始化实例变量的构造函数。换句话说,采用参数的构造函数称为参数化构造函数。 Q7。Java中的单例类是什么?如何使单例类成为单例?...Singleton类是在一个给定的时间在一个JVM中只能创建一个实例的类。可以通过将构造函数设为私有来使类成为单例。 Q8。Java中的数组列表和向量有什么区别? 数组列表 向量 阵列列表未同步。...生命周期 存在,直到线程执行结束。 堆内存从应用程序执行的开始一直到结束。 用法 堆栈内存仅包含堆空间中对象的局部原语和引用变量。 每当创建对象时,它总是存储在堆空间中。 Q11。

    1.1K20

    【1】进大厂必须掌握的面试题-Java面试-基础

    请参考下图,该图显示了不同的原始类型,包装器类和构造函数参数。 Q6。Java中的构造函数是什么? 在Java中,构造函数是指用于初始化对象的代码块。它必须与该类具有相同的名称。...换句话说,默认构造函数是无参数构造函数,如果用户没有定义其他构造函数,则默认情况下将创建该构造函数。其主要目的是用默认值初始化实例变量。而且,它主要用于对象创建。...参数化构造函数: Java中的参数化构造函数是能够使用提供的值初始化实例变量的构造函数。换句话说,采用参数的构造函数称为参数化构造函数。 Q7。Java中的单例类是什么?如何使单例类成为单例?...Singleton类是在一个给定的时间在一个JVM中只能创建一个实例的类。可以通过将构造函数设为私有来使类成为单例。 Q8。Java中的数组列表和向量有什么区别? 数组列表 向量 阵列列表未同步。...生命周期 存在,直到线程执行结束。 堆内存从应用程序执行的开始一直到结束。 用法 堆栈内存仅包含堆空间中对象的局部原语和引用变量。 每当创建对象时,它总是存储在堆空间中。 Q11。

    1.7K00

    Java面试基本问题

    请参考下图,该图显示了不同的原始类型,包装器类和构造函数参数。 Q6。Java中的构造函数是什么? 在Java中,构造函数是指用于初始化对象的代码块。它必须与该类具有相同的名称。...换句话说,默认构造函数是无参数构造函数,如果用户没有定义其他构造函数,则默认情况下将创建该构造函数。其主要目的是用默认值初始化实例变量。而且,它主要用于对象创建。...参数化构造函数: Java中的参数化构造函数是能够使用提供的值初始化实例变量的构造函数。换句话说,采用参数的构造函数称为参数化构造函数。 Q7。Java中的单例类是什么?如何使单例类成为单例?...Singleton类是在一个给定的时间在一个JVM中只能创建一个实例的类。可以通过将构造函数设为私有来使类成为单例。 Q8。Java中的数组列表和向量有什么区别? 数组列表 向量 阵列列表未同步。...生命周期 存在,直到线程执行结束。 堆内存从应用程序执行的开始一直到结束。 用法 堆栈内存仅包含堆空间中对象的局部原语和引用变量。 每当创建对象时,它总是存储在堆空间中。 Q11。

    1.1K50

    你有认真了解过自己的“Java 对象”吗

    我们从四个方面重新认识下自己的“对象” 创建对象的 6 种方式 创建一个对象在 JVM 中都发生了什么 对象在 JVM 中的内存布局 对象的访问定位 一、创建对象的方式 使用 new 关键字 这是创建一个对象最通用...每当我们序列化和反序列化对象时,JVM 会为我们创建了一个独立的对象。在 deserialization 中,JVM 不使用任何构造函数来创建对象。...所以,一般来说,执行 new 指令后接着执行 init 方法,把对象按照程序员的意愿进行初始化(应该是将构造函数中的参数赋值给对象的字段),这样一个真正可用的对象才算完全产生出来。...由于 reference 类型在 Java 虚拟机规范里只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到 Java 堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同...使用句柄方式最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。

    1.1K10

    类和对象(万字总结!深度总结了类的相关知识)(上)

    构造函数:构造函数是用于初始化对象的特殊成员函数。构造函数的名字与类名相同,它在创建对象时自动调用。可以定义多个构造函数以支持不同的初始化方式。...6.类的实例化 类的实例化是指使用类的定义来创建具体的对象。类在C++中可以看作是一个模板,而实例化则是基于这个模板生成实际的对象,给对象分配内存并赋予它所定义的属性和行为。...6.1 什么是类的实例化 类是对现实世界中对象的抽象,它定义了对象的属性和方法,但并不占用内存。 当我们实例化一个类时,C++会根据类的定义为对象分配内存,并使对象具备类定义的功能和属性。...6.4 通过构造函数初始化对象 当我们实例化类时,构造函数会被自动调用来初始化对象。C++允许通过不同的构造函数进行不同方式的初始化。...静态实例化在栈上分配内存,动态实例化在堆上分配内存。 构造函数用于在实例化时初始化对象,析构函数在对象销毁时释放资源。 每个对象有自己独立的成员变量,但共享同一类的成员函数。

    9510

    Java虚拟机--对象的建立你的对象如何创建?

    在实际开发过程中,有很多行为可以引起对象的创建,最直接最常用的就是使用new关键字来进行创建,这种方式在Java规范中被称为:由执行类实例创建表达式而引起的对象创建。...一种是TLAB,即把内存分配按照不同的线程划分在不同的Java虚拟机堆空间中进行, 说简单点就是为每个线程预先在堆中分配一块内存空间, 这样的空间我们称之为本地线程分配缓冲(TLAB),当有对象进行内存分配时...对象的初始化 在Java对象初始化过程中,主要涉及三种初始化,分别是实例变量初始化、实例代码块初始化以及构造函数初始化。 实例变量初始化 ?...image 从测试结果来看,当构造函数执行之前就会完成实例代码块的初始化操作。 但是,在通过查看编译后的.class文件时,我们发现示例代码块中的内容被编译到了构造函数中,所以说不存在谁先谁后。 ?...image 构造函数初始化 众所周知,每一个Java对象都至少包含一个构造函数,如果我们没有显式声明,编译器会自动生成一个默认无参构造。在编译后的字节码中,构造函数会被命名成()方法。

    1.2K60

    JVM 中对象咋创建啊,又怎么访问啊

    类加载完成之后,初始化之前,开始进行对象内存分配,分配好之后将内存区域的值全部置为0(成员变量初始化),之后执行实例构造器指令 ,完成后返回对象引用。 目录: 对象是怎么完成创建的?...(后面在虚拟机执行章节中有具体的加载过程笔记),然后检验其是否被初始化(这个初始化是指的类初始化,也就是执行)过 类加载完成确定类的内存大小 在新生代分配内存 执行构造函数,返回引用地址 简单总结:类初始化...static 关键字修饰的方法或变量成为类变量,没有被 static 修饰的部分称为实例变量 下面是对象创建细节的拆分 怎么分配内存 指针碰撞 如果内存中现有的分配情况为整齐分布,则会有一个...另外一个例子是当我们发布软件的新版本时,也会说 bump the version number。 内存分配的并发问题 由于多线程情况,有可能刚申请的内存被其他线程提前写入,导致内存分配出现问题。...至此对象在内存中"完成创建",但此时的对象并不能使用,接着会继续执行构造函数中的内容,来完成对象程序中的初始化步骤,构造函数执行结束后,对象完成创建。

    58410

    Java-JVM

    Java中创建对象有5中方式 使用new关键字 调用了构造函数 使用Class的newInstance方法 调用了构造函数 使用Constructor类的newInstance方法 调用了构造函数 使用...clone方法 没有调用构造函数 使用反序列化 没有调用构造函数 Java对象创建的流程 image.png 虚拟机遇到一条new指令时,先检查常量池是否已经加载相应的类,如果没有,必须先执行相应的类加载...内存的分配会根据Java堆是否规整, 有两种方式: image.png 处理并发安全问题 对象的创建在虚拟机中是一个非常频繁的行为,哪怕只是修改一个指针所指向的位置,在并发情况下也是不安全的,可能出现正在给对象...目前主流的访问方式有句柄和直接指针两种方式。 指针: 指向对象,代表一个对象在内存中的起始地址。 句柄: 可以理解为指向指针的指针,维护着对象的指针。...,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而引用本身不需要修改。

    1.1K30

    Effective Modern C++翻译(1):序言

    为什么你在使用lambda表达式时应该避免默认的变量捕捉形式?或者是std::atomic和volatile的区别和如何正确的使用它们?...当一个对象以另一个同样类型的对象初始化的时候,这个新的对象被认为原对象的一个拷贝,即使这个拷贝是经由移动构造创建的,令人遗憾的是,C++中没有任何一个技术可以区分一个对象是经由拷贝构造创建的,还是经由移动构造创建的...的参数w的时,你无法知道创建参数w所需要的花费(你同样需要知道拷贝构造和一个构造widget的花费)。...在一个函数调用中,调用端的表达式是这个函数的实参(argument),这些参数被用来实例化函数的形参(parameters),在第一个例子中,实参是wid,在第二个例子中,实参是std::move(wid...:vector的界限,解引用一个未实例化的迭代器,或者涉及到数据竞争(例如有两个以上的线程,至少一个是写者,同时访问一个内存单元)。

    1.2K90

    Java对象的结构与对象在内存中的结构

    对象的创建过程 当我们在Java中使用new这个指令创建一个对象的时候,对象的创建到底经过了什么样的一个过程呢?...下面使用伪代码来表示实例化一个对象: Class A { int m = 8; } A a = new A(); 这段代码在堆内存中创建了一个对象,其具体的执行汇编码主要是以下几步: 0 new #2...>:执行A的初始化方法,即构造方法。 7 astore_1:将变量a和新创建的对象建立关联(引用指向内存)。...这其中可以发现,当我们在堆内存中开辟内存时,还没有执行A的构造函数,也就是说此时内存中的相关对象并没有进行赋值操作。...这就叫做对象的半初始化,以前文的代码为例,当执行到创建对象,开辟内存空间的这一步操作时,a对象的内存空间中虽然会出现一个m对象,但由于还没有执行类的构造函数,这个对象就不会被赋值,默认值为0。

    1.7K11

    智能指针详解

    cout << "Main: Finished." << endl; return 0; } 在上述代码中,我们创建了一个共享资源Resource的实例,并在主线程和另一个线程中对其进行操作。...主线程在启动另一个线程后早期销毁了资源,而另一个线程仍在使用已经销毁的资源。这会导致未定义行为,访问无效的内存,可能导致崩溃或数据损坏。...析构函数处理:智能指针的析构函数中通常包含了对所拥有对象的内存释放操作,确保在智能指针被销毁时,关联的资源也会被释放。这种自动化的资源管理有助于避免内存泄漏和资源泄漏。...std::unique_ptr支持所有权的转移,可以通过move将一个std::unique_ptr实例的所有权转移到另一个实例。这种所有权转移可以通过移动构造函数和移动赋值运算符来实现。...在初始化一个shared_ptr之后,可以复制它,将其分配给其他shared_ptr实例。 所有实例均指向同一个对象,并共享资源与一个控制块。

    34240

    30道最常问的Java基础面试题

    ,而抽象类不一定接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。...对象实体与对象引用有何不同?**new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。...构造方法有哪些特性?**名字与类名相同;没有返回值,但不能用void声明构造函数;生成类的对象时自动执行,无需调用。**23. 静态方法和实例方法有何不同?...静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制.**24. 对象的相等与指向他们的引用相等,两者有什么不同?...与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

    30810

    C++类与对象深度解析(一):从抽象到实践的全面入门指南

    类的实例化 2.1实例化概念 实例化是指在物理内存中创建对象的过程。类是对象的抽象描述,它提供了对象的结构和行为,但是类本身并不占用物理空间,只有当类被实例化时,才会在内存中分配空间。...2.确保类的指针行为一致:即使是空类的指针,指向不同对象时,它们也必须指向不同的内存地址。如果空类对象占0字节,就无法保证这一点。...这里的 n 是栈的初始大小,默认值为4。构造函数在对象创建时自动调用,确保对象处于有效的状态。 析构函数 ~Stack():当栈对象被销毁时,自动释放动态分配的内存。...拓展解释:构造函数和析构函数 (在下一篇博客会详细解释) 构造函数:它是类中的特殊函数,当类的对象被创建时,构造函数会被自动调用,用于初始化对象。...在 Stack 类中,构造函数初始化栈的容量,并为数组分配内存。 析构函数:它也是类中的特殊函数,当对象生命周期结束(如对象作用域结束时)时,析构函数会自动调用,用于释放对象所占用的资源。

    9900

    c#面试题抽象类和接口的区别-金三银四面试:C#程序员经常遇到的30道基础面试题,想你所想

    在C#中,new关键字可用作运算符和修饰符。   (1)new运算符用于在堆上创建对象和调用构造函数。   (2)new修饰符用于隐藏基类成员的继承成员。   ...您可以创建值类型的实例,将它们作为参数传递,将它们存储为局部变量,或将它们存储在另一值类型或对象的字段中。值类型没有与存储类的实例相关的系统开销,并且它们不需要构造函数。值类型可以有字段、属性和事件。...;和int.;   11、C#中有没有静态构造函数,如果有是做什么用的?   有。静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。...静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。   ...静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。   12、在C#中如何实现多态?

    2K20

    一篇文章带你对Java对象创建过程解密

    Java程序在运行过程中无时无刻不在创建对象,在代码层面其实就是一个简单的new的一个过程。但是底层实现逻辑并非如此。那么它究竟是如何进行创建对象的呢?接下来我们一起来一探究竟。...:类加载检查 当我们在Java程序中new一个对象的时候,在底层其实会有大概以下几步: 首先它会检查这个指令是否能在常量池中能否定位到一个类的符号引用 接着会检查这个符号引用代表的类是否已经被加载、解析...其实很简单,就是借助一个指针(这里是不是呼应上了所谓的指针碰撞);当我们分配内存的时候就是把指针在空闲的内存区域中移动一个与要被创建对象大小相等的距离。这就是指针碰撞的方式。...它无非就是指在Java堆中的内存并非是规整的(使用的内存和未使用过的内存没有划分开来),比较杂乱无章,此时虚拟机就得需要列表记录内存中哪些是已经使用的哪些是没有使用的,然后在给对象分配内存空间的时候在该列表中找一个足够的内存分给对象实例...对象中需要的其它资源和状态信息还没有按照原有的意图去构造好。所以一般来说,new指令之后就会执行init方法,按照Java程序员的意图去对对象做一个初始化,这样之后一个真正完整可用的对象才构造出来

    16710

    深入浅出MFC-读书笔记

    但是由于Win32 系统令hPrevInstance 永远为0(这里应该是因为让窗口类只实例化一次,虽然系统支持多实例化占不同内存资源),所以我们仍然得以把RegisterClass 和CreateWindow...如果基础类别和衍生类别都定义了「相同名称之成员函数」,那么透过对象指针调用成员函数时,到底调用到哪一个函数,必须视该指针的原始型别而定, 而不是视指针实际所指之对象的型别而定。...衍生类别会继承基础类别的虚拟函数表(以及所有其它可以继承的成员),当我们在衍生类别中改写虚拟函数时,虚拟函数表就受了影响:表中元素所指的函数地址将不再是基础类别的函数地址,而是衍生类别的函数地址。...第三章:MFC 六大关键技术之仿真 MFC类别阶层 MFC 数个最重要类别的阶层关系如下: MFC 程序的初始化过程 CmyWinApp创建线程后进行初始化操作,InitApplication...)也记录在类别型录中,当程序在执行时期获得一个类别名称,它就可以在「类别型录网」中找出对应的元素,然后调用其构造函数(这里并非指C++ 构造式),产生出对象。

    87520

    C#new一个对象时

    问:当我们new一个对象时,会发生什么事? 答:调用该类型的构造函数。 问题看似简单,不过事实上,CLR做的比这要多。。。 要准确回答这个问题,还要分情况来说。...而对于类型指针,则将其指向一个实实在在的对象——即该类型的类型对象实例。 再然后,就是调用类型的构造函数了。...然后,CLR分配所需的内存。在哪里分配呢?这可说不准,在堆上或在栈上都有可能。 再然后就是调用类型构造函数了。这里需要注意,CLR并没有初始化这段内存块,而是把初始化内存块的任务都交给构造函数了。...这样做是为了保证值类型轻量性的特点。这也是为什么C#语言在值类型的构造函数中强制要求为所以字段赋值的原因。另外,所有值类型的默认构造函数都会把内部字段都初始化为0。 到此,一个值类型也做好了。...所以,每当我们想要实例化一个类型的时候,都需要三思而后行。。。 附:关于内存对齐(这个是我之前学习的笔记,记得不是很系统,有兴趣的同学凑合看一下吧。。。) 为什么要内存对齐?

    68031

    硬钢百度面试!

    创建时间少)线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存、文件管理信息切换虚拟地址空间,切换内核栈和硬件上下文,页表切换开销很大,而线程在创建的过程中,不会涉及这些信息,...所以在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。 为什么构造函数不写为虚函数?...问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。...而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。...考虑类的情况 const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员的值可以不同,所以不能在类中声明时初始化。

    19920
    领券