指针和引用的区别
指针是一块内存地址,存储的是变量的地址,可以动态改变。
引用是变量的别名,创建后就不能更改。
指针能指向空地址(nullptr),但引用不能。
指针可以做“加法操作”,偏移地址访问内存,而引用不能。
构造函数和析构函数的作用
构造函数负责初始化对象。
析构函数负责释放对象占用的资源,防止内存泄漏。
虚函数的作用
虚函数实现多态,允许基类的指针或引用调用派生类的成员函数。
虚函数通过虚函数表实现,调用时根据实际对象类型进行动态绑定。
new和malloc的区别
`new`是C++运算符,调用对象构造函数,并返回指向对象的指针。
`malloc`是C语言函数,只分配内存,不调用构造函数,需要手动调用`free`释放内存。
struct和class的区别
`struct`的默认访问权限是`public`,而`class`的默认访问权限是`private`。
多态的实现
编译时多态(函数重载)。
运行时多态(虚函数)。
内存管理
使用`new/delete`进行内存分配和释放,它们会调用对象的构造函数和析构函数。
避免内存泄漏,及时释放不再使用的内存。
C++11新特性
`auto`关键字用于自动推导变量类型。
`nullptr`和`NULL`的区别:`nullptr`是C++11引入的空指针常量,而`NULL`通常是一个宏定义(如`0`或`(void*)0`)。
设计模式
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
观察者模式:定义对象间的一种一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。
未定义行为和实现定义行为
未定义行为:标准中完全没有规定,行为不可预测,不可依赖,完全不可利用。
实现定义行为:标准中规定,行为可预测,可靠的,可完全利用,可跨平台使用,但具体实现由编译器平台自由选择。
这些面试题涵盖了C++的基础知识、面向对象编程、内存管理等多个方面,是面试中常见的问题。建议你在准备面试时,重点复习这些知识点,并多做一些实际编程练习,以加深理解和记忆。