1.语法基础
1.函数重载基本原理
什么是重载?C++允许统一作用域内声明几个功能类似的同名函数,这些同名函数的形参列表(参数的个数、类型、顺序)必须不同,常用于处理功能类似但是数据类型不同的问题,底层原理就是程序在编译的阶段会根据编译器的函数名修饰规则去生成新的函数名,所以C++函数名同名,参数不同的函数,他们在编译器看来也是不同的。
怎么限制函数重载呢?用前面学的extern关键字,以C语言的风格进行编译起到兼容C的作用。
2.指针和引用的区别
什么是指针?存储一个变量的地址。什么是引用?给一个变量起别名。引用可以直接操作数据,不用解指针,指针在用法上还需要注意空指针和野指针。引用不能为空,而指针在定义的时候可以不初始化,指针++是加到下一个地址,引用++是数值++,底层汇编上引用是用指针实现的,VS汇编代码,除此之外指针和引用可以做参数和返回值,代表的意思也不相同。



3.nullptr和null 的区别
主要区别就是nullptr是一个类型安全的空指针常量,可以调用nullptr_t的构造去隐私转换其他类型的指针变量,null是一个宏,表示void* 或者0,传入的类型可能不安全,因为不知道是整数类型还是指针类型。



4.宏
如何定义宏函数,#define ADD(x,y) ((x)+(y))
宏的优点:代码的复用性高,提高性能。宏的缺点:会因为运算符的优先级导致运算出错,没有类型检查不安全,不方便调试。
C++替换宏的做法:const、enum替换宏常量,inline替换宏函数。
5.类和对象
5.1理解面向对象和面向过程
面相对象更加关注的是类与类对象之间的交互。面向过程更关注具体过程的实现。在解决实际问题上,面相对象更加完整,每个对象都有自己的属性和方法,而且更容易扩展。耦合度关联度低,比较松散,面向过程是一些结构体和函数,比较紧凑。
面相对象的特性:封装、继承、多态。
封装:第一层理解用C语言实现一个栈,定义结构体,变量和函数,把结构体当做参数传进去。第二层理解:为了更规范的去使用数据。避免一会访问数据一会访问方法。C++把想访问的定义为公有,不想 访问的去定义为私有。同时只能通过函数去调用数据。这样的管理更符合高内聚低耦合的设计原则,也更方便管理数据。
继承:类层次的复用,给类之间加上关系,更加简化代码逻辑。
多态:静态的多态和动态的多态,静态的多态就是函数重载或者cout自动识别类型,以及函数模版。动态的多态是运行时多态,对象里有虚表指针,指向虚表,虚表里存放虚函数,子类对象可以重写父类对象的虚函数,指向父类调父类,指向子类调子类。
5.2四个默认成员函数及其实现细节(实际是8个)
简单理解为初始化,清理,括号(),等号=,移动构造,移动复制, 取地址,const &取地址。
5.3其他
static修饰类成员
const修饰成员函数
this指针可以为空指针,不解引用就不会崩
this指针在栈区,因为是形参,VS为了提高效率,放入寄存器中,他指向的对象在堆栈或者全局,但他本身计算临时变量,通常在栈区。
友元,友元函数可以直接访问全部的成员。加一个friend关键字,一般用于重写<<和>>
内部类,内部类就是外部类的友元,反过来不是,内部类可以通过外部类的对象参数进行访问外部类,枚举类型和static可以直接访问。
5.4深浅拷贝
“面试官您好,深浅拷贝是 C++ 中对象复制的两种方式。浅拷贝只是复制对象的引用,而深拷贝则会复制对象的所有数据,包括指针所指向的内存。
浅拷贝可能会导致一些问题,比如如果原始对象的数据被修改,那么复制对象也会受到影响。深拷贝则可以避免这些问题,因为它会创建一个新的对象,拥有自己的内存空间。
在实际应用中,我们应该根据具体情况选择合适的拷贝方式。如果对象比较简单,而且不需要修改原始对象的数据,那么浅拷贝就可以满足需求。如果对象比较复杂,或者需要修改原始对象的数据,那么深拷贝就更加合适。”


