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

【C++】多态

那么大家想想为什么有人扫的红包又大又新鲜8块、10块…,而有人扫的红包都是1毛,5毛…。其实这背后也是一个多态行为。...3 虚函数重写的两个例外 3.1 函数的重写 我们来看这样一种场景: 还是Person和Student两个类,STUdent继承Person,它们都显示实现了自己的,我们运行程序 这没什么问题...,结果我们也理解,子类对象s先,子类的函数调再完成后自动调用父类的清理父类的部分。...但是在这个地方,我们期望它是这样正常的只调父类的? 是不是不期望啊,因为如果父类的指针指向的是子类对象,在delete的时候还是只调父类的,那是不是就可能会有内存泄漏的风险啊。...但是: 重写不是要求基类和派生类的虚函数名字一样,可是它们两个的函数名字并不一样啊。

9310

【细品C++】C++动态内存管理

为什么要提供这个假象呢?下面我在这简单解释一下,毕竟这是属于操作系统的知识,这里只需要简单理解一下帮助我们理解就行。...,delete会调用函数,而malloc/free不会。...delete[]的原理 在释放的对象空间上执行N次函数,完成N个对象中资源的清理。...申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用函数完成空间中资源的清理。...这份代码不是向操作系统申请了资源没有返还为什么操作系统不报警? 要解释这个现象需要涉及一些操作系统的知识,展开来讲内容太多了,这里简单解释一下。还记得本篇文章一开头讲的虚拟进程地址空间

14200
您找到你想要的搜索结果了吗?
是的
没有找到

【C++】类和对象(第二篇)

对象生命周期结束时,C++编译系统系统自动调用函数 函数起作用的关键就在这里,对象声明周期结束时编译器自动调用函数对对象的资源进行清理。...一个类只能有一个函数。若未显式定义,编译器自动生成默认的函数 这一点呢和构造函数一样,如果我们自己不写函数,则编译器自动生成默认的函数。...简单解释一下: 这里是st2先,我们知道st1和st2都是在栈上的(栈区) ,那栈区之所以叫栈区也是有些讲究的,它在这个地方栈帧的建立也是遵循先进后出的这个顺序的,即后定义的先进行。...但是有时候呢不排除有人可能会写出这样的代码: 把自己赋给自己。 这样可以?...那赋值重载也是运算符重载,我们刚才是定义在类里面的,那它可以重载到外面? 我们试一下: 先把成员变量的private注释掉,确保在类外访问。

9810

C++反汇编第二讲,不同作用域下的构造和的识别

E2函数内部则会调用函数,有人会说,为什么不直接将注册为函数回调,这样直接调用atexit不就在释放的时候,从后往前依次调用的了吗....会生成一个检查标志,根据这个标志判断,是否调用构造和 跳过一个 构造和注册的一块区域 总结:    生成检查标志,跳过构造和注册代理....当Delete的时候传入1, 这个是按位来的, 如果最低位为1,则是代表释放内存,那么就调用并且释放,如果为0,则仅仅代表了调用....为什么这样:   在早期,硬件资源匮乏,内存想重复利用. 所以会有人显示的调用构造(vc6.0中可以)然后显示的调用进行管理,示例: ?...加上类域则可以调用构造了,那么我们是显示调用,所以看看汇编代码,传入0,不会释放内存的. ?

1.1K100

.NET面试题解析(06)-GC与内存管理

如果内部出现异常依然释放资源? 8. 解释一下C#里的函数为什么有些编程建议里不推荐使用函数呢? 9. Finalize() 和 Dispose() 之间的区别? 10....Finalize() :终结器(函数) 首先了解下Finalize方法的来源,她是来自System.Object中受保护的虚方法Finalize,无法被子类显示重写,也无法显示调用,是不是有点怪?...无法被子类显示重写:.NET提供类似C++函数的形式来实现重写,因此也有称之为函数,但其实她只是外表和C++里的函数像而已。...如果内部出现异常依然释放资源? using() 只是一种语法形式,其本质还是try…finally的结构,可以保证Dispose始终会被执行。 8. 解释一下C#里的函数?...为什么有些编程建议里不推荐使用函数呢? C#里的函数其实就是终结器Finalize,因为长得像C++里的函数而已。

55110

.NET面试题解析(06)-GC与内存管理

如果内部出现异常依然释放资源? 8. 解释一下C#里的函数为什么有些编程建议里不推荐使用函数呢? 9. Finalize() 和 Dispose() 之间的区别? 10....Finalize() :终结器(函数) 首先了解下Finalize方法的来源,她是来自System.Object中受保护的虚方法Finalize,无法被子类显示重写,也无法显示调用,是不是有点怪?...无法被子类显示重写:.NET提供类似C++函数的形式来实现重写,因此也有称之为函数,但其实她只是外表和C++里的函数像而已。...如果内部出现异常依然释放资源? using() 只是一种语法形式,其本质还是try…finally的结构,可以保证Dispose始终会被执行。 8. 解释一下C#里的函数?...为什么有些编程建议里不推荐使用函数呢? C#里的函数其实就是终结器Finalize,因为长得像C++里的函数而已。

60720

剖析【C++】——类与对象(中)——小白篇—超详解

C++11引入了在类定义时为内置类型成员变量提供默认值的功能,从而增强了默认构造函数的实用性。 3.函数详解 函数是C++中的一个重要概念,它使对象在销毁时自动清理资源。...std::cout << _year << "-" << _month << "-" << _day << std::endl; } ~Date() { // 编译器自动调用这个函数...一个类只能有一个函数。若未显式定义,系统自动生成默认的函数函数不能重载。 对象生命周期结束时,C++编译系统自动调用函数。...一个类只能有一个函数,不能重载。当对象的生命周期结束时,C++编译器自动调用函数。...例如: { Date tempDate; // 创建临时对象 } // tempDate 超出作用域,调用函数 2.5 显示日期 display函数用于输出日期。

8910

《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

所有有人一看到 static 这个单词就主观的认为是存放在全局数据区,那是不对的。...函数没有参数,也没有返回值,而且不能重载,在一个类中只能有一个函数。当撤销对象时,编译器也自动调用函数。...77、构造函数函数可以调用虚函数为什么 1) 在C++中,提倡不在构造函数函数中调用虚函数; 2) 构造函数函数调用虚函数时都不使用动态联编,如果在构造函数函数中调用虚函数,...而构造函数是在创建对象时自动调用的,不可能通过父类或者引用去调用,因此就规定构造函数不能是虚函数 (4)函数一般都要声明为虚函数这个应该是老生常谈了,这里不再赘述 《为什么C++不能有虚构造函数,...《构造函数或者函数中调用虚函数怎么样?》

2.3K40

多态

什么是多态 同种消息不同的对象接受后产生不同的状态,知道是这个东西就行,不懂也没有什么问题,看后文就可以。...函数的重新:虽然父子的函数名不一样,但是在编译看来是相同的,因为它都编译器统一处理为destructor。...所以函数的重写只需要在基类上加上virtual就可以构成重写。 为什么函数进行重写呢?...静态成员可以是虚函数? 构造函数,拷贝构造,赋值运算符的重载可以是虚函数函数可以是虚函数? 对象访问普通函数快还是虚函数快 虚函数表在什么阶段产生的,存在哪里?...赋值运算符的重载是可以是虚函数函数可以是虚函数,虽然函数函数名不一样,但是在编译器看来,都被处理为destructor,上文有解释为什么要把函数写成虚函数

23420

继承

如果基类中有默认成员函数,当派生类中不显示调用的时候,自动调用。 对于构造函数,都会在初始化列表的时候自动调用基类的构造函数。...对于函数,在对象销毁的时候,自动调用基类的函数,在调用自身的函数,所以,不需要自己在函数里面显示的调用基类的函数。...这样才能保证先派生类,再基类 构造函数 1.当基类有默认的构造函数的时候,可以只初始化派生类新的成员变量,也可以自己调用基类的默认构造,看自己的心情。..._b; return *this; } }; int main() { B x; B y(x); return 0; } 函数 派生类的函数在对象销毁的时候,自动调用基类的函数...,所有不需要自己再手动调用基类的函数

22540

C++11 在函数中执行lambda表达式(std::function)捕获this指针的陷阱

} 在eclipse+gcc(5.2)环境下编译运行,的确输出预期的运行结果,程序结束的时候,调用了指定的lambda表达式: !! !Hello World!!!...std::function对象已经被清除了,这时fun已经是个无效变量,执行它当然抛出异常。...为了证实这个判断,打开头文件#include 找到function的函数,如下图在函数上设置一个调试断点,再运行程序到断点处。 看下图中的”调用堆栈”窗口。...解决问题 解决这个问题的办法很多种, 总的原则就是:如果要在函数中调用lambda表达,就要避免lambda使用类成员变量, 对于这个例子,最简单的办法就是修改test_lambda构造函数...我同样用前面在std::function函数加断点的方式在eclipse+gcc环境下做了测试,测试结果表明gcc也是按C++标准顺序执行对象的,但不同的是gcc在构造下面这个lambda表达式时

1.5K10

C++从入门到精通——类的6个默认成员函数函数

函数 前言 一、函数的概念 二、函数的特性 三、函数的练习题 四、总结 前言 类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有?...二、函数的特性 函数是特殊的成员函数,其特征如下: 函数名是在类名前加上字符 ~。 无参数无返回值类型。 一个类只能有一个函数。若未显式定义,系统自动生成默认的函数。...,是否完成一些事情呢?...:~Time() 在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的函数?...三、函数的练习题 两个栈实现一个队列 四、总结 有资源需要显示清理,就需要写函数。如Stack List 没有资源需要清理,如Date (日期类),内置类型成员没有资源需要清理。

20010

【C++】继承

但我们看到s自动去调用了它父类的构造和。 那如果我子类对象自己显示实现构造函数呢? 我们发现这里我们自己初始化继承下来的_name成员但是报错了。 为什么不行呢?...4.4 函数函数呢?按照上面的规律,都是先调用父类的处理父类成员,然后再处理自己的,那我们可以这样写: 但我我们发现这里调不了父类的。 那为什么调不了父类的呢?...这下就好了,所以父类的自动调,但是前面那几个都是先父后子,这个怎么先调用子类的,再是父类啊。...所以这里才不需要我们自己去显式调父类的,而是它自己调,其实就是为了保证这个顺序。 所以对于函数: 派生类(子类)的函数会在调用完成后自动调用基类(父类)的函数清理基类成员。...我们可以将它的构造函数函数设置成私有的。 为什么这样就可以呢?

10210

C++奇迹之旅:构造函数函数

类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有?并不是,任何类在什么都不写时,编译器自动生成以下6个默认成员函数。...year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; // 以下测试函数通过编译...函数 函数:与构造函数功能相反,函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用函数,完成对象中资源的清理工作。...特性 函数是特殊的成员函数,其特征如下: 函数名是在类名前加上字符 ~。 无参数无返回值类型。 一个类只能有一个函数。若未显式定义,系统自动生成默认的函数。...Time类的函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁main函数中并没有直接调用Time类函数,而是显式调用编译器为Date类生成的默认函数 注意:创建哪个类的对象则调用该类的函数

8410

C++中的单例模式

有经验的读者可能问,m_pInstance指向的空间什么时候释放呢?更严重的问题是,该实例的函数什么时候执行?...一个妥善的方法是让这个类自己知道在合适的时候把自己删除,或者说把删除自己的操作挂在操作系统中的某个合适的点上,使其在恰当的时候被自动执行。 我们知道,程序在结束的时候,系统自动所有的全局变量。...事实上,系统也所有的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在单例类中定义一个这样的静态成员变量,而它的唯一工作就是在函数中删除单例类的实例。...delete CSingleton::m_pInstance;           }       };   static CGarbo Garbo;  //定义一个静态成员变量,程序结束时,系统自动调用它的函数...程序运行结束时,系统会调用CSingleton的静态成员Garbo的函数,该函数删除单例的唯一实例。

2.1K10

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

空类中真的什么都没有?并不是,任何类在什么都不写时,编译器自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器自动生成(半自动化)的成员函数称为默认成员函数。...编译器自动生成一个默认的无参构造函数这个自动生成的构造函数不会进行任何实质性的初始化操作。...3.2 特性 函数是特殊的成员函数,其特征如下: 函数名是在类名前加上字符 ~。 无参数无返回值类型。 一个类只能有一个函数。若未显式定义,系统自动生成默认的函数。...关于编译器自动生成的函数,是否完成一些事情呢?下面的程序我们会看到,编译器生成的默认函数,对自定类型成员调用它的函数。...:~Time() 在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的函数

7210

c++类和继承面试点25连问

= nullptr ) { delete a; } return 0; } 这段代码执行后输出如下: A() B() ~A() 构造的时候是正常的,但是的时候只调用了基类的函数...,确保派生类的函数会被调用。...因为销毁的时候直接销毁的基类指针,此时编译器只知道调用基类,并不会主动去调用派生类的函数,所以基类函数需为虚函数,这样运行时程序才会去调用派生类的函数,其实这就相当于函数的多态,...基于多态的作用,这个指向派生类的基类指针先调用派生类的函数,然后再调用基类的函数。...函数是否可以抛异常 可以,但是最好不要抛出,如果一定要抛出,那要在函数内部处理,保证函数执行完成。 16.

90910

C++之类和对象

函数的特性如下: 1.函数名是在类名前加上字符 ~ (表示与构造函数功能相反);; 2.无参数无返回值; 3.一个类只能有一个函数,若未显式定义,系统自动生成默认的函数;(注意:...函数不能重载) 4.对象生命周期结束时,C++编译系统系统自动调用函数; 5.函数对内置类型不处理,对自定义类型调用它自身的函数 可以看到,虽然我没有调用函数,但是编译器在...选择处理 对于没有资源申请的类可以不用显示定义函数,编译器自动生成的函数就够用,但是对于有资源申请的类就必须要显示定义函数否则会造成资源损失。..._capacity; } 深拷贝栈st1需要有一块和st2相同大小的空间,或许有人疑惑为什么一定要先释放然后重新开辟,而不能使用realloc来改变大小。...匿名对象 所谓匿名对象就是在定义时不给它取名字,这样的对象生命周期只有定义那一行,因为没有名字所以无法被别人使用,一旦出了那一行就没有人记得它了。

1.1K00
领券