本书汇集了腾讯公司最新的C和C++编程语言相关的面试题目,涵盖数据结构、算法及面向对象设计等核心内容,适合程序员准备面试时参考。
### 腾讯C/C++ 最新面试题库知识点详解
#### 1. new、delete、malloc、free 关系
- **new 和 delete**:这两个是C++特有的运算符,用于动态内存分配和释放。`new`不仅分配内存,还会调用对象的构造函数;`delete`则会调用对象的析构函数并释放内存。
- **malloc 和 free**:这些是C语言的标准库函数,也用于动态内存分配和释放。`malloc`仅负责分配内存,而`free`仅负责释放内存,不会涉及任何构造或析构过程。
对于复杂的对象类型,仅使用`malloc`和`free`是不够的,因为它们不能确保对象的构造和析构正确执行。因此,在C++中通常推荐使用`new`和`delete`。
#### 2. delete 和 delete[] 区别
- **delete**:用于释放由`new`分配的单个对象的内存,并调用其析构函数。
- **delete[]**:用于释放由`new[]`分配的数组内存,并依次调用数组中每个对象的析构函数。
示例代码:
```cpp
MemTest* mTest1 = new MemTest[10];
MemTest* mTest2 = new MemTest;
int* pInt1 = new int[10];
int* pInt2 = new int;
// 正确使用
delete[] pInt1;
delete[] mTest1;
// 错误使用
delete[] mTest2;
```
对于自定义的复杂数据类型,如`MemTest`,必须使用`delete[]`来释放数组,以确保每个对象的析构函数都被调用。对于内置数据类型,如`int`,两者可以互用,但习惯上仍推荐匹配使用。
#### 3. C++ 的面向对象特性
C++的三大面向对象特性包括:
- **封装**:通过隐藏对象的实现细节和限制外部直接访问对象的数据成员来实现。
- **继承**:允许多个类共享共同的行为和属性。
- **多态**:允许通过基类指针或引用操作派生类的对象,使程序更加灵活和扩展性强。
#### 4. 子类析构时要调用父类的析构函数吗?
在C++中,子类的析构函数默认是调用父类析构函数的。析构顺序是从派生类到基类。这意味着,当一个派生类对象被销毁时,首先调用派生类的析构函数,接着调用基类的析构函数。
#### 5. 多态、虚函数、纯虚函数
- **多态**:在运行时通过基类指针或引用操作派生类对象的能力。
- **虚函数**:基类中声明为`virtual`的成员函数,可以在派生类中重写。
- **纯虚函数**:在基类中声明为`virtual`且没有定义体的成员函数,通常格式为`virtual void func() = 0;`。包含纯虚函数的类被称为抽象类,不能实例化,只能作为其他类的基类。
#### 6. 函数返回值计算
函数`int func(int x)`用于计算整数`x`的二进制表示中1的个数。例如,对于`x = 9999`,函数返回8。
#### 7. “引用”的概念及使用注意事项
- **引用**:实际上是变量的别名,引用自身并不占用存储空间。
- **注意事项**:
- 引用声明时必须初始化。
- 一旦声明,引用不能被重新绑定到另一个变量。
- 不能声明引用数组。
#### 8. 引用作为函数参数的特点
- **传递引用给函数**:等同于传递指针。函数内的修改会影响到原始变量。
- **优点**:
- 避免了值传递带来的额外开销。
- 可以返回多个值。
总结,理解和掌握这些基本概念对于通过腾讯C/C++面试至关重要。通过实际编码练习,可以更好地理解和运用这些知识点。