c++面试题集锦
c++基础
C语言和C++有什么区别?
- 面向对象编程(OOP):
- C语言是一种过程式编程语言,不支持面向对象编程。
- C++是一种支持面向对象编程的语言,它提供了类、对象、继承、多态和封装等特性。
- 标准库:
- C语言的标准库相对较小,主要包括输入输出、字符串处理、数学计算等基本功能。
- C++的标准库更为丰富,除了包含C语言的标准库外,还包括STL(标准模板库),提供了向量、列表、队列、栈等数据结构和算法。
- 类型检查:
- C语言的类型检查较为宽松。
- C++的类型检查更为严格,例如,C++中函数重载和构造函数的概念都需要严格的类型检查。
- 函数重载:
- C语言不支持函数重载,即不能有同名函数。
- C++支持函数重载,可以在同一个作用域内定义多个同名函数,只要它们的参数列表不同即可。
- 引用:
- C语言中没有引用的概念,只能使用指针。
- C++引入了引用的概念,引用可以看作是变量的别名,使用起来比指针更简单、更安全。
- 异常处理:
- C语言通常使用返回值和错误码来处理错误。
- C++提供了异常处理机制,可以使用try、catch和throw关键字来处理运行时错误。
- 构造函数和析构函数:
- C语言中没有构造函数和析构函数的概念。
- C++中的类有构造函数和析构函数,用于对象的初始化和清理。
- 模板:
- C语言不支持模板。
- C++支持模板,可以创建通用函数和类,用于不同数据类型的操作。
总的来说,C++可以看作是C语言的超集,它保留了C语言的核心语法和特性,同时增加了面向对象编程和其他现代编程特性。
特性 | C语言 | C++ |
---|---|---|
内存管理 | 手动管理内存,使用malloc 、free 等函数 |
自动管理内存,提供new 、delete 等运算符 |
对象和类 | 无对象和类概念 | 支持面向对象编程,有类和对象的概念 |
继承 | 无继承机制 | 支持单继承和多继承 |
函数重载 | 无函数重载 | 支持函数重载 |
模板 | 无模板 | 支持模板编程 |
异常处理 | 无异常处理机制 | 支持异常处理 |
运算符重载 | 无运算符重载 | 支持运算符重载 |
构造函数和析构函数 | 无构造函数和析构函数 | 支持构造函数和析构函数 |
类型安全 | 相对较低,易出现类型错误 | 较高,编译时进行类型检查 |
库支持 | 标准库较简单 | 标准库更丰富,支持STL等 |
编译器支持 | 几乎所有编译器都支持C语言 | 部分编译器不支持或支持不完善 |
c++的struct和class有什么区别?
- 默认访问权限:
- 在C++中,
struct
的成员默认为public
。 - 在C++中,
class
的成员默认为private
。
- 在C++中,
- 继承时的默认访问权限:
struct
继承时默认为public
继承。class
继承时默认为private
继承。
- 传统用法:
- 在C++中,
struct
通常用于数据封装,但也可以包含成员函数。 - 在C++中,
class
通常用于表示具有数据和行为的对象。
- 在C++中,
c语言的struct和c++的struct有什么区别?
- 成员默认访问权限:
- 在C语言中,
struct
的成员默认是公有的(public),可以在结构体外部直接访问。 - 在C++中,
struct
的成员默认也是公有的,但C++支持访问修饰符(public
、private
、protected
),允许你显式地指定成员的访问权限。
- 在C语言中,
- 包含成员函数:
- 在C语言中,
struct
只能包含数据成员,不能包含成员函数。 - 在C++中,
struct
可以包含成员函数,与class
几乎一样,struct
在C++中实际上是一种轻量级的类。
- 在C语言中,
- 构造函数和析构函数:
- C语言中的
struct
不支持构造函数和析构函数。 - C++中的
struct
可以定义构造函数和析构函数,用于对象的初始化和清理。
- C语言中的
- 继承:
- C语言中的
struct
不支持继承。 - C++中的
struct
可以继承其他struct
或class
,并且可以添加额外的成员。
- C语言中的
- 模板:
- C语言中的
struct
不支持模板。 - C++中的
struct
可以作为模板使用,创建可以与任何类型一起工作的通用结构体。
- C语言中的
- 默认的继承访问权限:
- C语言没有继承的概念,因此也就没有默认的继承访问权限。
- 在C++中,
struct
继承时默认的继承访问权限是公有的(public),而class
默认是私有的(private)。
总的来说,C++中的struct
在功能上更接近于class
,是C++面向对象编程的一部分。而C语言中的struct
仅用于定义数据结构。
特性/语言元素 | C语言 struct |
C++ struct |
C++ class |
---|---|---|---|
默认成员访问权限 | 公有 (public) | 公有 (public) | 私有 (private) |
成员函数 | 不支持 | 支持 | 支持 |
构造函数/析构函数 | 不支持 | 支持 | 支持 |
继承 | 不支持 | 支持 | 支持 |
多态 | 不支持 | 支持 | 支持 |
模板 | 不支持 | 支持 | 支持 |
访问修饰符 | 不支持 | 支持 (public , private , protected ) |
支持 (public , private , protected ) |
默认继承访问权限 | 不适用 | 公有 (public) | 私有 (private) |
extern "C"的作用?
在C++中,extern "C"
是一个链接规范(linkage specification),它告诉C++编译器以C语言的规则来处理特定的函数或变量声明。这主要用于以下几种情况:
- C和C++混合编程: 当一个项目同时使用了C和C++代码时,
extern "C"
允许C++代码调用C语言编写的函数。由于C++支持函数重载,它会在编译生成的符号中包含函数的参数类型信息,而C语言则不会。因此,如果不使用extern "C"
,C++编译器可能会生成与C编译器不同的函数名,导致链接时无法找到对应的C函数。
函数重载和覆盖有什么区别?
特性/概念 | 函数重载(Overloading) | 函数覆盖(Overriding) |
---|---|---|
定义 | 同一个作用域内,同名函数具有不同的参数列表。 | 子类中有一个与父类同名、同参数列表的函数。 |
作用域 | 通常在同一个类或命名空间内。 | 发生在继承关系中的子类和父类之间。 |
参数列表 | 必须不同。 | 必须相同。 |
返回类型 | 可以不同。 | 通常应相同或为子类类型(covariant return type)。 |
虚函数 | 不是必须的。 | 通常涉及虚函数(在父类中声明为虚函数)。 |
多态性 | 与多态性无关。 | 实现多态性的关键机制。 |
调用方式 | 编译器根据参数列表决定调用哪个函数。 | 通过指向父类的指针或引用调用子类的函数。 |
示例 | void print(int value); void print(double value); |
class Base { virtual void display(); }; class Derived : public Base { void display() override; }; |
了解RAII吗?介绍一下?
RAII(Resource Acquisition Is Initialization,资源获取即初始化)是C++语言中管理资源(如内存、文件句柄、网络连接等)的一种惯用法。它的核心思想是将资源的管理绑定到对象的生存周期上,利用对象的生命周期来控制资源的分配与释放,确保资源在使用完毕后能够被正确释放,从而避免资源泄漏。
RAII的特点:
- 构造函数获取资源:在对象的构造函数中进行资源的分配。
- 析构函数释放资源:在对象的析构函数中进行资源的释放。
- 对象作用域管理资源:通过对象的作用域来控制资源的生命周期。当对象创建时,资源被获取;当对象被销毁时(比如离开作用域),资源被自动释放。
RAII的优点:
- 防止资源泄漏:通过对象的生命周期管理资源,可以有效防止因为疏忽而忘记释放资源。
- 异常安全:即使在发生异常的情况下,对象的析构函数仍然会被调用,因此资源总是能够得到释放。
- 简化资源管理:将资源管理逻辑封装在对象的构造和析构中,简化了代码,提高了代码的可读性和可维护性。
类的大小怎么计算?
- 非虚成员:类中所有**非静态成员数据(不包括成员函数)**的大小总和。注意成员数据的对齐要求。
- 成员对齐:每个成员按照其类型的对齐要求在内存中进行对齐。
- 整体对齐:整个类的尺寸也要按照其最大成员的对齐要求进行对齐。
- 虚函数:
- 如果类中有虚函数,那么通常会有一个指向虚函数表的指针(vtable pointer)。
- 在大多数平台上,这个指针的大小是4字节(32位系统)或8字节(64位系统)。
- 继承:
- 如果类继承自