Qt专栏之C++预习篇(三)

Qt专栏之C++预习篇(三)

    • C++的秘密
      • 1.C++引用
      • 2.RTTI机制
      • 3.函数调用的开销
    • 知识速记
      • 小知识点

用Qt写上位机软件真的超级方便,小小编在这边分享一些如何从零开始通过Qt来制作上位机软件。

我们预习回顾下Qt使用的编程语言,本文旨在阐述C++的设计规范以及补充速记点

C++的秘密

1.C++引用

​ C/C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针。在C++中,有一种比指针更为便捷的传递聚合类型数据的方式,就是引用(Reference)

引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)。注意,引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址。

​ 注意const引用,只是表明保证不会通过此引用间接的改变被引用的对象。

​ 引用本质上是别名,逻辑上不独立,具有依附性,和指针的相同的都是地址的概念,指针指向一块内存,它的内容是所指内存的地址,而引用则是某块内存的别名。不同点:

  • 指针是一个变量,而引用仅是个别名;
  • 引用只能在定义时被初始化一次,之后引用不可变,引用对象或变量值可变;指针可变;
  • 引用是类型安全的,而指针不是 ,引用比指针多了类型检查。

2.RTTI机制

​ Run Time Type Identification运行时类型识别,程序能够使用基类的指针或引用来检查所指对象的实际派生类型。那么为什么需要这个机制呢?这个机制有什么用?

​ 由于C++本身是静态类型语言(和很多语言一样),在编译时数据类型就会确定下来,不能在运行时改变。然而对于面向对象思想中的多态性而言,C++指针或引用本身的类型,可能与它实际代表(指向或引用)的类型不一致,此时就需要知道运行时的类型信息,因此,通过RTTI中两个操作符typeid和dynamic_cast就可实现相关的操作。

typeid:返回指针和引用所指的实际类型;

dynamic_cast:将基类类型的指针或引用安全地转换为其派生类类型的指针或引用。

3.函数调用的开销

​ 函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。

​ 如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。一般将那些短小的、频繁调用的函数声明为内联函数inline(可直接定义在头文件中)。

知识速记

小知识点

  • 对象的大小只受成员变量的影响,和成员函数没有关系。成员函数在代码区分配内存,而不是在栈区;
  • C++规定,编译成员函数时要额外添加一个参数(this),把当前对象的指针传递进去,通过指针来访问成员变量,因此不是通过对象找函数,而是通过函数找对象
  • 调用没有参数的构造函数,调用时可省略括号;
  • 初始化const成员变量的唯一方法就是使用初始化列表;
  • 注意析构函数的执行时机:析构函数在对象被销毁时调用,而对象的销毁时机与它所在的内存区域有关:
    • 在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数;
    • 在函数内部创建的对象是局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的析构函数;
    • new 创建的对象位于堆区,通过 delete 删除时才会调用析构函数;如果没有 delete,析构函数就不会被执行。
  • 编译器通过指针来访问成员变量,指针指向哪个对象就使用哪个对象的数据(成员变量);编译器通过指针的类型来访问成员函数,指针属于哪个类的类型就使用哪个类的函数(成员函数)。然而,可以通过虚函数来使得基类指针可以对所有派生类进行“全方位“的访问,尤其是成员函数也可以,这就构成了多态
  • 为了避免内存泄露,需要将析构函数写出虚函数。当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数;
  • 在函数内部定义的变量、数组、结构体、共用体等都称为局部数据。在很多编译器下,局部数据的初始值都是随机的、无意义的,而不是我们通常认为的“零”值。这一点非常重要,大家一定要谨记,否则后面会遇到很多奇葩的错误。一个变量,即使不给它赋值,它也会有一个默认的值,这个值就是默认初始值

关注微信公众号『设计至纯』,查看更多原创内容,和小小编进行灵魂交流O(∩_∩)O欢迎疯狂点赞、分享、收藏、点赞、在看、点赞。 ^ o ^
Qt专栏之C++预习篇(三)_第1张图片

你可能感兴趣的:(Qt,qt)