1 C++11的新特性有哪些?
- long long 类型
- 列表初始化(花括号)
- nullptr常量
- auto类型指示符
- 类内初始化
- 范围for语句
- 智能指针——自动释放所指向的对象。
2 智能指针
2.1 shared_ptr
多个智能指针可以共享同一个对象,当指向对象的最后一个 shared_ptr 被销毁时,shared_ptr 类就会通过析构函数自动销毁这个对象。shared_ptr 还会自动释放所关联的内存。2.2 unique_ptr
在异常时,可以帮助避免资源泄露的智能指针,独占所指向的对象。拥有者被销毁或指向其他对象,之前的对象就会被销毁,相应的资源也会被释放。2.3 wake_ptr
是一种弱引用,指向shared_ptr所管理的对象,但不拥有某对象,一旦最后一个拥有该对象的智能指针失去所有权,wake_ptr 就会自动变成空。3 多态
C++多态意味着调用成员函数时,可以根据对象的类型执行不同的函数。多态以封装和继承为基础。
- 重载多态(Ad-hoc Polymorphism,编译期):函数重载、运算符重载
- 子类型多态(Subtype Polymorphism,运行期):虚函数
- 参数多态(Parametric Polymorphism,编译期):类模板、函数模板
- 强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换
4 析构函数
4.1 什么时候调用析构函数
delete一个对象的时候,先调用析构函数清理资源,然后底层调用free释放空间。5 内存泄漏2
申请了内存不释放5.1 什么情况会内存泄漏
- 指针重新赋值
- 错误的内存释放
-
5.2 如何解决
确保没有在访问空指针。
- 每个内存分配函数都有一个 free 与之对应,alloca 函数除外。
- 分配内存后及时初始化(可以结合 memset 函数进行初始化,calloc 函数除外。)
- 对指针赋值前,确保没有内存位置会孤立。
- 每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应先遍历子内存位置并从那里开始释放,然后再遍历回父节点。
- 始终正确处理返回动态分配的内存引用的函数返回值
6 C++和别的语言相比有什么不同
7 虚函数[3,4]
7.1 作用
允许用基类的指针来调用子类的函数7.2 案例
```cppinclude
using namespace std;
class A { public: void foo() { cout << “A::foo() is called” << endl; } };
class B : public A { public: void foo() { cout << “B::foo() is called” << endl; } };
int main() { A a = new A(); a->foo(); B b = new B(); b->foo(); A* c = new B(); c->foo(); return 0; }
以上代码的输出为
A::foo() is called B::foo() is called A::foo() is called
前两行的输出容易理解,但是第三行中 c 应该是 class B的对象,但是却调用了 class A 的函数。为了让第三行也输出 B::foo(),需要将 class A 中的 foo() 写成虚函数
```cpp
class A {
public:
virtual void foo() {
cout << "A::foo() is called" << endl;
}
};
8 声明和定义的区别
- 声明是让名字被程序知道,定义负责创建与名字关联的实体
- 声明和定义都规定了变量的名字和类型,但定义还申请了存储空间
- 只声明不定义,要在变量名前加
extern
且不能显示初始化变量 - 变量只能被定义一次,但可以被声明多次
参考
- https://gitee.com/vict0r/interview#%E5%A4%9A%E6%80%81
- https://blog.csdn.net/weixin_44718794/article/details/107071169
- https://www.runoob.com/w3cnote/cpp-virtual-functions.html
- https://baike.baidu.com/item/%E8%99%9A%E5%87%BD%E6%95%B0/2912832?fr=aladdin
持续更新