当前位置:   article > 正文

C++语言特性(长期更新)_yara c++

yara c++

C++是一门需要不断实践的语言,因为他的各种特性,编程技巧实在太多了,多到几乎难以完全掌握。可以说,学的越深入,用的越多,越发现自己的无知。所以,仅此记录自己在学习C++过程中或疑惑不解,或认知出错,或惊为天人的一些语言特性、编程技巧与底层内涵!

  • 拥有虚函数的类会有一个虚表,而且这个虚表存放在类定义模块的数据段中。模块的数据段通常存放定义在该模块的全局数据和静态数据,这样我们可以把虚表看作是模块的全局数据或者静态数据,类的虚表会被这个类的所有对象所共享。类的对象可以有很多,但是他们的虚表指针都指向同一个虚表,从这个意义上说,我们可以把虚表简单理解为类的静态数据成员。值得注意的是,虽然虚表是共享的,但是虚表指针并不是,类的每一个对象有一个属于它自己的虚表指针。虚表中存放的是虚函数的地址。
  • 表格中的virtual functions地址是如何被建构起来的?在C++中,virtual functions(可经由其class object被调用)可以在编译时期获知。此外,这一组地址是固定不变的,执行期不可能新增或替换之。由于程序执行时,表格的大小和内容都不会改变,所以其建构和存取皆可以由编译器完全掌控,不需要执行期的任何介入。
  • 虚表指针则是在进入构造函数主体前被初始化的,(这个工作是编译器做的,对程序员来说是透明的),我们可以把构造函数的调用过程细分为两个阶段,即:1.进入到构造函数体之间。在这个阶段如果存在虚函数的话,虚表指针被初始化。如果存在构造函数的初始化列表的话,初始化列表也会被执行。2.进入到构造函数体内。这一阶段是我们通常意义上说的构造函数。
  • 由于虚函数的调用需要靠虚表指针获取虚函数地址,因此如果将构造函数声明为虚函数,会导致在虚表指针未初始化前即试图使用,从而产生错误。而析构函数则一般要声明为虚函数,在子类构造时,会先执行父类默认构造函数,再执行子类构造函数,而析构则相反,如果析构函数不为虚函数,则在多态(父类指针指向子类对象)析构时,会因无法动态绑定而只调用父类析构函数而不调用子类析构函数。
  • C++在公有继承时,子类会继承父类的所有成员变量与方法(
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号