C++中容易被忽略的基础知识

const和define的区别
C++中static关键字的总结
C++中的构造函数及深拷贝浅拷贝
c++基础之引用和指针的学习和区别
c++中的new和delete
C++中多态
c++智能指针用法
c++中的字符串string和C语言中的字符char
C++中的构造函数
c++中的内联函数
c++中struct和class关键字区别
C++中重写、重载、重定义

  • 构造函数为什么不能是虚函数?
    虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。
    而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。
  • 基类析构函数最好是虚函数,为什么?
    还不错,值得一看

要回收一个对象申请的资源,就需要调用析构函数。有时虽然没有显式的调用析构函数,但是编译器都会默认地为我们执行析构函数。
当执行BaseClass *base = new BaseClass();。执行delete base时,会调用析构函数为我们释放资源。
而执行**BaseClass *sub = new SubClass(); **。如果BaseClass基类的析构函数不是虚函数时,delete sub对象时,只会释放BaseClass基类申请的资源,而不是释放SubClass派生类的资源。原因如下:
基类指针指向派生类对象,而基类中的析构函数是非virtual的,而虚构函数是动态绑定的基础。现在析构函数不是virtual的,因此不会发生动态绑定,而是静态绑定,指针的静态类型为基类指针,因此在delete的时候只会调用基类的析构函数,而不是调用派生类的析构函数。这样,在派生类中申请的资源就不会得到释放,就会造成内存泄露。如果系统中有大量的派生类对象被这样创建和销毁,就会有内存不断的泄露,久而久之,系统会因为缺少内存而崩溃。

  • 构造函数有哪些必须在初始化列表完成?
  1. 常量成员: 只能初始化不能赋值,所以必须放在初始化列表中。
  2. 引用类型: 引用必须在定义时初始化,并且不能重新赋值,所以必须放在初始化列表中
  3. 对象成员: 放在初始化列表中,会更高效。
  • 如果类在实现时,构造函数设置为protected,为什么?什么时候用?
    基类中private类型的成员变量或方法,在所有派生类中是不可见,但protected类型的成员变量或方法是可见的。
    对于protected函数,只能造子类内部和本类内部调用,private函数,只能在本类内部中调用。
  • pack()字节对齐内容
  • c++中的全局变量
    extern: 两个类共用一个变量时
  • 有如下2个文件:test.cpp,test.hpp,简述下g++编译器将其编译成binary的工程中都做了哪些事情?
    预处理,编译,汇编,连接。


    image.png

你可能感兴趣的:(C++中容易被忽略的基础知识)