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

为什么析构函数默认不是虚拟的[C++]

析构函数默认不是虚拟的是因为C++的设计原则之一是避免在默认情况下引入额外的运行时开销。虚拟函数需要额外的指针和表来实现动态绑定,这会增加对象的内存开销和运行时间开销。如果析构函数被声明为虚拟的,那么每个对象都需要一个虚拟函数表,这会增加程序的内存和性能开销。

然而,如果一个类被设计为可以被继承,并且需要在派生类中重写析构函数,那么可以手动将析构函数声明为虚拟的。这样,在执行派生类的析构函数时,基类的析构函数也会被正确地调用,以确保资源的正确释放。

总之,析构函数默认不是虚拟的是为了避免不必要的运行时开销,但在需要的时候可以手动将其声明为虚拟的。

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

相关·内容

11.7 C++函数

C++函数概述 C++函数是一个特殊成员函数,作用与构造函数相反,它名字是类名前面加一个~符号,函数是与构造函数作用相反函数,当对象生命期结束时,会自动执行函数。...C++执行函数情况 如果在一个函数中定义了一个对象,当这个函数被调用结束时,对象应该释放,在对象释放前自动执行函数。...如果定义了一个全局对象,则在程序流程离开其作用域时,调用该全局对象函数。 如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象函数。 ...C++函数详解 函数作用并不是删除对象,而是在撤销对象占用内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。...如果没有定义函数C++编译系统会自动生成一个函数,但它只是徒有函数名称和形式,实际上什么都不执行,要想让函数执行,必须在定义函数中指定。

2.9K01

C++四个默认函数(构造函数函数,拷贝函数,赋值函数

C++中,对于一个类,C++编译器都会为这个类提供四个默认函数,分别是: A() //默认构造函数 ~A() //默认函数 A(const A&) //默认拷贝构造函数 A& operator...函数 与构造函数相对立函数,这个函数在对象销毁之前自动调用,例如在构造函数中,我们为成员变量申请了内存,我们就可以在函数中将申请内存释放,函数写法是在构造函数基础上加一个~符号...class Animal { private: string name; public: Animal();//默认构造函数 ~Animal(); //默认函数 }; ---- 三....这个例子调用默认拷贝构造函数(注意看控制台显示,调用了一次构造函数和两次函数),可以看出两个对象成员变量地址是不一样,当成员变量不存在指针类型是,这样做没什么问题,当类中有指针变量,自动生成拷贝函数注定会出错...可以看到两个对象指针成员所指内存相同(内存里面存着字符串:花狗),还记得函数作用吗,在对象销毁之前自动调用,在构造函数中,我们为成员变量申请了内存,我们就可以在函数中将申请内存释放。

2.2K20

C++函数解析

当派生类对象从内存中撤销时一般先运行派生类函数,然后再调用基类函数。...如果用new运算符建立派生类临时对象,对指向基类指针指向这个临时对象当用delete运算符撤销对象时,系统执行是基类函数,而不是派生类函数,不能彻底“清理现场”。...解决方法是将基类及派生类函数设为虚函数,这时无论基类指针指向哪个派生类对象,系统会采用动态关联,调用相应函数对对象进行清理。...这样就达到我们目的了,基类,派生类都调用了函数,另外需要注意是 在基类函数声明为虚函数时,由该基类派生函数也自动成为虚函数,即使派生类函数与基类函数名字不相同。  ...对象cl在函数fc结束时执行Circle函数,撤销局部变量c1.p所指向对象地址通过函数返回值赋予q,q所指向对象在执行delete时执行函数

91670

C++ 构造函数函数

本文主要介绍了类对象通过拷贝函数进行初始化,分析了类对象内存模型,以及通过this指针来实现更复杂功能。最后介绍了函数基础知识。...与构造函数一样,C++默认提供了一个空函数,定义为:~类名( )。...由于开辟在栈区变量程序会自动释放,因此不需要函数执行清理工作,但是当程序员在堆区开辟空间时,需要手动执行清理工作,这时候需要函数来释放堆区内存。...比如: ~person() { // 在函数内写入需要执行代码 cout << "调用函数" << endl; } person p1(20); person p2(10); // 在生命周期结束后自动调用函数执行清理工作...输出为: 调用函数 调用函数

94600

C++】构造函数函数

本篇文章来讲解C++中构造函数函数一些比较重要知识,主要包括下面几个: 1.构造函数函数,没有返回值。2.如果实现多态的话,函数需要是虚函数。3.构造函数不能是虚函数。...2.多态时候,为什么函数需要是虚函数? 当然,我们可以在多态时候,不将构造函数定义成虚函数,这样也是可以编译运行,并且指定继承类创建和销毁时候,也没有问题。...既然我们希望用基类指针去表示继承类,这种情况下如果函数不是函数,就有可能出问题,基类指针函数被调用时,不会去释放继承类自己部分那一部分数据,会导致这部分数据释放不掉。...4.为什么构造函数函数不能调用virtual函数?...函数在继承类函数被调用时候,对象内类变量被认为是未定义值,所以也就没有办法找对对应函数列表,当然也就没有办法找对虚函数列表中对应函数地址。

99821

C++:构造函数函数

函数 说简单点就是和构造函数有着相反作用,函数用于初始化而函数用于在对象销毁前将构造函数申请资源释放。...可以理解为用 new 申请堆内存后需要使用 delete 对其进行释放,函数作用相当于 delete。...正是由于函数此特点,所以它定义与构造函数区别仅为一个逻辑非运算符,即:~ class instance{ public: instance(){ name = new...char[20]; } ~instance(){ delete[] name;//释放申请堆空间 name = nullptr; } 函数在对象生命周期时会依次调用,且调用顺序与构造函数相反...默认构造函数 C++ 规定每一个类都必须有一个构造函数,如果没有定义构造函数,系统将调用默认构造函数(等价于定义一个空构造函数)。

53720

C++C++构造函数函数

C++提供构造函数来处理对象初始化。 构造函数是一种特殊成员函数,不需要用户来调用,定义对象时被自动执行。 构造函数名字与类名相同,无返回类型(void也不能有哦)。...函数 也是C++一个成员函数函数作用和构造函数相反。 命名规则与类名相同,但是需要在类名前加上”~”符号。 ~在C++中是取反运算符。...函数作用不是删除对象,而是说,在对象撤销它所占用内存之前做一些清理工作,清理之后,这个对象内存可以被分配给其他对象使用。 在设计类时候,都会给类提供一个函数。...构造函数函数都是可以由用户来定义,但是调用,都是可以由程序来自动调用。 构造函数是在定义一个对象时候执行,而函数是在对象生命周期结束之后,自动执行函数。...函数没有返回值和参数! 注意:函数没有参数,不能被重载,因此一个类只能有一个函数。如果用户没有定义,编译器会自动生成一个默认函数

58010

C++】构造函数函数用途 ( 代码示例 - 构造函数函数用途 )

一、构造函数函数C++ 语言中 , " 构造函数 " 和 " 函数 " 都是 C++ 类中 特殊函数 , 分别用于 初始化对象 销毁对象 ; C++ 类 在创建 实例对象 时自动调用...; C++ 类 在 销毁 实例对象 时自动调用 函数 这个特殊函数 , 其主要作用是 销毁释放对象成员变量 , 如果需要 可以 执行其他必要操作 ; 函数 名称 是 ~ 加上 类名称...; 函数 没有返回类型 ; 函数 不带参数 ; 二、代码示例 - 构造函数函数用途 在下面的代码中 : C++ 类 Student 类 有 2 个 public 共有成员变量 , public...也是常用操作之一 ; 在 函数 中 , 只需要将 name 指针进行销毁即可 , 销毁前确保 name 指针不为空 , 否则会存在导致运行时崩溃隐患 ; // 销毁 name 指向堆内存空间...时 , Student s1 时 自动调用 Student 类构造函数 , main 函数执行完毕退出程序时 , 自动调用 Student 函数 , 销毁对象 ; 调用构造函数 name : Tom

15620

C++构造函数函数

C++中每个类都有其构造与函数,它们负责对象创建和对象清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。...下面仍然是通过反汇编方式来说明C++中构造和函数是如何工作。...编译器是否真的会默认提供构造与函数 在一般讲解C++书籍中都会提及到当我们不为类提供任何构造与函数时编译器会默认提供这样六种成员函数:不带参构造,拷贝构造,“=”重载函数函数,以及带const...,首先会调用拷贝构造(当程序不提供拷贝构造时,系统默认在对象之间进行简单内存复制,这个就是提供默认拷贝构造函数)然后当函数结束,程序执行到函数大括号初时,首先调用完成对象内存释放,然后执行函数返回和做最后清理工作...,但是接着执行类函数函数中定义类对象,接受返回值得这块内存一直等到它所在语句块结束才调用 如果不要这个返回值时又如何呢,下面的代码说明了这个问题 int main() {

1.6K10

C++】构造函数函数详解

6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...默认成员函数:用户没有显式实现,编译器会生成成员函数称为默认成员函数。 重点关注前面四个。 2. 构造函数 在写栈或者队列时可能会忘记初始化,就会开始其他操作,所以c++就提出构造函数。...,则C++编译器会自动生成一个无参默认构造函数,一旦用户显式定义编译器将不再生成。...函数 3.1 概念 通过前面构造函数学习,我们知道一个对象是怎么来,那一个对象又是怎么没呢?...函数:与构造函数功能相反,函数不是完成对对象本身销毁,局部对象销毁工作是由编译器完成。而对象在销毁时会自动调用函数,完成对象中资源清理工作。

10510

C++ 函数不要抛出异常

1.函数抛出异常问题 函数从语法上是可以抛出异常,但是这样做很危险,请尽量不要这要做。...原因在《More Effective C++》中提到两个: (1)如果函数抛出异常,则异常点之后程序不会执行,如果函数在异常点之后执行了某些必要动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏问题...(2)通常异常发生时,c++异常处理机制在异常传播过程中会进行栈展开(stack-unwinding),因发生异常而逐步退出复合语句和函数定义过程,被称为栈展开。...在栈展开过程中就会调用已经在栈构造好对象函数来释放资源,此时若其他函数本身也抛出异常,则前一个异常尚未处理,又有新异常,会造成程序崩溃。...如果函数发生异常,不要让异常逃离析函数函数应该捕捉任何异常,不传播或结束程序; (3)如果客户需要对某个操作函数运行期间抛出异常作出反应,那么class应该提供一个普通函数(而非在函数

1.2K40

C++干货基地】六大默认成员函数: This指针 | 构造函数 | 函数

同时这六个默认成员函数也是我们面向对象核心,下面我们就来先介绍一下构造函数函数 三、构造函数 3.1 构造函数概念 构造函数咋一听名字各位是不是觉得他是用来创建函数,其实大家是被名字误导了...这里很多人就觉得为什么对内置类型不处理,自动处理了不是更好吗?...4.2 函数特性 函数是特殊成员函数,其特征如下: 函数名是在类名前加上字符 ~。 无参数无返回值类型。 一个类只能有一个函数。若未显式定义,系统会自动生成默认函数。...注意:函数不能重载 对象生命周期结束时,C++编译系统系统自动调用函数。...下面的程序我们会看到,编译器 生成默认函数,对自定类型成员调用它函数

5900

C++:50---虚函数

二、虚函数 使用方法和规则与虚函数一样 格式要求: 虚函数要求基类与派生类中名称不一致 只要基类函数是虚函数,就能确保我们在释放指针时准确运行哪个版本(基类or派生类)函数 如果基类指针指向于自己...,那么delete时候执行就是自己函数 如果基类指针指向于派生类对象,那么delete时候执行就是派生类函数(这个就是多态性质,与执行虚函数原理一样) 如果基类函数不是函数...,则delete一个指向派生类对象基类指针将产生未定义行为 与虚函数一样,如果基类函数为virtual,那么派生类函数也都是virtual(即使是编译器默认合成也是virtual)...但是基类函数并不遵循这个规则:一个基类总是需要函数,而且它能将函数设定为虚函数,此时,该函数为了成为虚函数而令内容为空,我们显然无法由此推断该基类还释放需要复制运算符或拷贝构造函数...endl; } }; int main() { A* pa = new B(); delete pa; int a = 0; } 输出: A() B() ~A() 如果我们把A函数声明成虚拟函数

82220

C++进阶之路:何为默认构造函数函数(类与对象_中篇)

6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...不显示定义,编译器自动生成, 显示定义 6.关于编译器生成默认成员函数为什么在不实现构造函数情况下,编译器会生成默认构造函数。但是看起来默认构造函数又没什么用?...函数(Destructor): 与构造函数对应,函数用于在对象销毁时进行清理工作,释放对象占用资源。如果没有显式定义函数,编译器也会生成一个默认函数。...对象生命周期结束时,C++编译系统系统自动调用函数。 5. 关于编译器自动生成函数,是否会完成一些事情呢?...下面的程序我们会看到,编译器生成默认函数,对自定类型成员调用它函数 6.

8300
领券