Skip to content

Latest commit

 

History

History
149 lines (149 loc) · 24.9 KB

C++.md

File metadata and controls

149 lines (149 loc) · 24.9 KB
  • 一.变量
  • 二.函数
  • 三.类
    • 1)面向对象的三大特性(封装、继承、多态)
    • 2)struct和class的区别?
    • 3)访问权限说明符?(目的是加强类的封装性)
    • 4)类的静态成员(所属?静态成员函数不能声明成const、类类型的成员、定义时不能重复使用static、具有类内初始值的静态成员定义时不可再设初值)
    • 5)构造函数相关
      • 有哪些构造函数(默认、委托、拷贝、移动)
      • 合成的默认拷贝构造函数(默认行为?什么情况下不会合成?怎么解决?如果成员包含类内初始值,合成默认构造函数会使用该成员的类内初始值初始化该成员)
      • 拷贝构造函数(调用时机、合成版的行为、explict?、为何第一个参数必须是引用类型)
      • 移动拷贝构造函数(非拷贝而是窃取资源、与noexcept?、何时合成)
      • 可否通过对象或对象的引用(指针或引用)调用
    • 6)初始值列表(顺序、效率(内置类型不进行隐式初始化故无所谓,但..)、无默认构造函数的成员,const成员,引用成员必须通过初始值列表初始化)
    • 7)赋值运算符相关
      • 拷贝赋值运算符(合成版的行为?、与delete?、自定义时要注意自赋值,参数与返回类型、大部分组合了拷贝构造函数与析构函数的工作)
      • 阻止拷贝(某些对象应该独一无二(比方说人)、C++11前:private并且不定义(试图拷贝会报链接错误),C++11:=delete 《Effective C++:条款6》
      • 移动赋值运算符(与noexcept?何时合成)
      • 可以定义为成员或非成员函数,定义成成员函数时第一个操作数隐式绑定到this指针
      • 不可重载的操作符有哪些?(?:,::)
    • 8)析构函数相关
    • 9)删除的合成函数(一般函数而言不想调用的话不定义就好)
    • 10)继承相关
      • 继承体系中的构造、拷贝、析构顺序?(派生类只负责自己成员的拷贝控制,可以(换而言之非必须,如果不显示调用,会调用父类合成的默认版本)在初始值列表或函数体中调用基类相应函数)
      • 继承中的名字查找(作用域嵌套、从子类到父类查找;成员名字的处理
      • 成员函数体内、成员函数的参数列表的名字解析时机(因此,务必将“内嵌的类型声明”放在class起始处)
      • 同名名字隐藏(如何解决?(域作用符,从指示的类开始查找)、不同作用域无法重载、using的作用?除此之外呢?)
      • 虚继承(解决什么问题?(多继承中的子对象冗余))
    • 11)多态的实现?
    • 12)虚函数的实现原理?对类大小的影响?(vtbl是一个由函数指针组成的数组,无论pb指向哪种类型的对象,只要能够确定被调函数在虚函数中的偏移值,待运行时,能够确定具体类型,并能找到相应vptr,进一步能找出真正应该调用的函数)
    • 13)为什么不要在构造、析构函数中调用虚函数?(子对象的base class构造期间,对象的类型是base class 《Effective C++:条款9》设置虚函数指针的时机
    • 14)虚函数被覆盖?
    • 15)virtual函数动态绑定,缺省参数值静态绑定(《Effective C++:条款37》
    • 16)纯虚函数与抽象基类(纯虚函数与虚函数、一般成员函数的选择
    • 17)静态类型与动态类型(引用是否可实现动态绑定)
    • 18)浅拷贝与深拷贝(安全性、行为像值的类与行为像指针的类)
    • 19)如何定义类内常量?(enum而不是static const 《Effective C++:条款2》
    • 20)继承与组合(复合)之间如何选择?(《Effective C++:条款38》
    • 21)private继承?(《Effective C++:条款39》
    • 22)如何定义一个只能在堆上(栈上)生成对象的类?
    • 23)内联函数、构造函数、静态成员函数可以是虚函数吗?
  • 四.内存管理
  • 五.STL
  • 六.对象内存模型
  • 七.关键字
    • 1)extern?(extern "C"?、与static?、有什么问题?、extern的时候定义变量?)
    • 2)const?(修饰变量、修饰指针与引用、修饰成员函数 《Effective C++:条款3》
    • 3)mutable?
    • 4)static?(修饰变量、类中使用)
    • 5)define与const、enum、inline?(《Effective C++:条款2》、C中默认const是外部连接的,而C++中默认const是内部连接的)
    • 6)explict?(抑制隐式转换、可通过显示转换或直接初始化解决、类外定义时不应重复出现)
    • 7)noexcept?(承诺不会抛出异常)
    • 8)default、delete?(显示要求编译器合成、不能被调用)
    • 9)using?(用于命名空间?、用于类中?)
    • 10)final?(修饰类?、修饰成员函数?只有虚函数能使用final)
    • 11)auto(初始值为引用时类型为所引对象的类型、必须初始化、不能用于函数及模板)、decltype?
    • 12)volatile?(对象的值可能在程序的控制外被改变时,应将变量申明为volatile,告诉编译器不应对这样的对象进行优化,如果优化,从内存读取后CPU会优先访问数据在寄存器中的结果,但是内存中的数据可能在程序之外被改变、可以既是const又是volatile,const只是告诉程序不能试图去修改它.volatile是告诉编译器不要优化,因为变量可能在程序外部被改变)
  • 八.其它
    • 1)调试程序的方法?(gdb
    • 2)遇到coredump要怎么调试?
    • 3)模板的用法与适用场景
    • 4)用过C++11?新特性?(auto,decltype、explicit、lambda、final)
    • 5)函数调用的压栈过程
    • 6)sizeof和strlen的区别?(运算符与函数、计算的对象、编译时运行时)
    • 7)union?
    • 8)覆盖、重载与隐藏(覆盖要求参数完全相同,用于继承体系的虚函数中,重载要求参数不同)
    • 9)C++是不是类型安全的?(不是,两个不同类型指针可以强制转换)
    • 10)gcc和g++的区别?(gcc代表GUN Compiler Collection,是一堆编译器的集合,包括g++)
    • 11)运行时类型识别实现对象比较函数
    • 12)使用C++实现线程安全的单例模式
    • 13)什么是异常安全?