c++面试题集锦--c++基础(持续更新)

c++面试题集锦

c++基础

C语言和C++有什么区别?

  1. 面向对象编程(OOP)
    • C语言是一种过程式编程语言,不支持面向对象编程。
    • C++是一种支持面向对象编程的语言,它提供了类、对象、继承、多态和封装等特性。
  2. 标准库
    • C语言的标准库相对较小,主要包括输入输出、字符串处理、数学计算等基本功能。
    • C++的标准库更为丰富,除了包含C语言的标准库外,还包括STL(标准模板库),提供了向量、列表、队列、栈等数据结构和算法
  3. 类型检查
    • C语言的类型检查较为宽松。
    • C++的类型检查更为严格,例如,C++中函数重载和构造函数的概念都需要严格的类型检查。
  4. 函数重载
    • C语言不支持函数重载,即不能有同名函数。
    • C++支持函数重载,可以在同一个作用域内定义多个同名函数,只要它们的参数列表不同即可。
  5. 引用
    • C语言中没有引用的概念,只能使用指针。
    • C++引入了引用的概念,引用可以看作是变量的别名,使用起来比指针更简单、更安全。
  6. 异常处理
    • C语言通常使用返回值和错误码来处理错误。
    • C++提供了异常处理机制,可以使用try、catch和throw关键字来处理运行时错误。
  7. 构造函数和析构函数
    • C语言中没有构造函数和析构函数的概念。
    • C++中的类有构造函数和析构函数,用于对象的初始化和清理。
  8. 模板
    • C语言不支持模板。
    • C++支持模板,可以创建通用函数和类,用于不同数据类型的操作。

总的来说,C++可以看作是C语言的超集,它保留了C语言的核心语法和特性,同时增加了面向对象编程和其他现代编程特性。

特性 C语言 C++
内存管理 手动管理内存,使用mallocfree等函数 自动管理内存,提供newdelete等运算符
对象和类 无对象和类概念 支持面向对象编程,有类和对象的概念
继承 无继承机制 支持单继承和多继承
函数重载 无函数重载 支持函数重载
模板 无模板 支持模板编程
异常处理 无异常处理机制 支持异常处理
运算符重载 无运算符重载 支持运算符重载
构造函数和析构函数 无构造函数和析构函数 支持构造函数和析构函数
类型安全 相对较低,易出现类型错误 较高,编译时进行类型检查
库支持 标准库较简单 标准库更丰富,支持STL等
编译器支持 几乎所有编译器都支持C语言 部分编译器不支持或支持不完善

c++的struct和class有什么区别?

  1. 默认访问权限
    • 在C++中,struct的成员默认为public
    • 在C++中,class的成员默认为private
  2. 继承时的默认访问权限
    • struct继承时默认为public继承。
    • class继承时默认为private继承。
  3. 传统用法
    • 在C++中,struct通常用于数据封装,但也可以包含成员函数。
    • 在C++中,class通常用于表示具有数据和行为的对象。

c语言的struct和c++的struct有什么区别?

  1. 成员默认访问权限
    • 在C语言中,struct的成员默认是公有的(public),可以在结构体外部直接访问。
    • 在C++中,struct的成员默认也是公有的,但C++支持访问修饰符(publicprivateprotected),允许你显式地指定成员的访问权限。
  2. 包含成员函数
    • 在C语言中,struct只能包含数据成员,不能包含成员函数。
    • 在C++中,struct可以包含成员函数,与class几乎一样,struct在C++中实际上是一种轻量级的类。
  3. 构造函数和析构函数
    • C语言中的struct不支持构造函数和析构函数。
    • C++中的struct可以定义构造函数和析构函数,用于对象的初始化和清理。
  4. 继承
    • C语言中的struct不支持继承。
    • C++中的struct可以继承其他structclass,并且可以添加额外的成员。
  5. 模板
    • C语言中的struct不支持模板。
    • C++中的struct可以作为模板使用,创建可以与任何类型一起工作的通用结构体。
  6. 默认的继承访问权限
    • 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语言的规则来处理特定的函数或变量声明。这主要用于以下几种情况:

  1. 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的特点:

  1. 构造函数获取资源:在对象的构造函数中进行资源的分配。
  2. 析构函数释放资源:在对象的析构函数中进行资源的释放。
  3. 对象作用域管理资源:通过对象的作用域来控制资源的生命周期。当对象创建时,资源被获取;当对象被销毁时(比如离开作用域),资源被自动释放。

RAII的优点:

  • 防止资源泄漏:通过对象的生命周期管理资源,可以有效防止因为疏忽而忘记释放资源。
  • 异常安全:即使在发生异常的情况下,对象的析构函数仍然会被调用,因此资源总是能够得到释放。
  • 简化资源管理:将资源管理逻辑封装在对象的构造和析构中,简化了代码,提高了代码的可读性和可维护性。

类的大小怎么计算?

  1. 非虚成员:类中所有**非静态成员数据(不包括成员函数)**的大小总和。注意成员数据的对齐要求。
  2. 成员对齐:每个成员按照其类型的对齐要求在内存中进行对齐。
  3. 整体对齐:整个类的尺寸也要按照其最大成员的对齐要求进行对齐。
  4. 虚函数
    • 如果类中有虚函数,那么通常会有一个指向虚函数表的指针(vtable pointer)。
    • 在大多数平台上,这个指针的大小是4字节(32位系统)或8字节(64位系统)
  5. 继承
    • 如果类继承自
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值