C++笔试题目总结(一)

错题来自于牛客网:【RYG】C++基础技能练习场

在C++中,如果将一个成员函数声明为const,则该函数不会修改对象的状态。这种声明还具有哪种特殊含义? 

A 该函数无法访问类的私有成员

B 该函数可以在常量和非常量对象上调用

C 该函数只能在常量对象上调用

D 该函数不能返回任何值

答案:C, 常成员函数不能修改成员变量的值。 常成员函数可以有返回值,返回值可以被非常量接受,并且完全可以访问常量对象

C++ 中,类的私有成员变量可以在类外部通过指针访问。

答:错误的,类成员的私有变量外部指针不能访问,这点和结构体不一样,结构体可以使用二级指针绕过结构体本身直接访问成员变量。但是我个人认为这个不完全错误,事实上只要拿到内存地址,搞清楚类成员变量的内存布局,可以通过操作地址的方法获取内存变量。

在 C++ 中,虚函数的调用是静态绑定还是动态绑定,取决于指针或引用的类型。

答:正确的,

  • 当你通过一个基类的指针或引用去调用一个虚函数时,调用将是动态的,即会根据对象的实际类型来决定调用哪个函数实现。
  • 如果你有一个对象实例,并直接通过该对象调用虚函数,这也仍然是动态绑定,尽管这种情况下类型是明确的。
  • 反之,如果函数不是虚函数,或者你是通过一个非基类指针或引用调用(即使对象是多态类型的),那么调用就是静态绑定(编译时绑定),由编译器决定调用哪个函数。
在 C++ 中,使用关键字 explicit 可以避免隐式类型转换。

答:正确的,主要用于类的构造函数上,防止出现隐式类型转换。尤其是存在多个构造函数的时候

下面哪些成员函数不能被定义为虚函数?

A 全局函数        B 拷贝构造函数         C 析构函数        D 私有成员函数

答:ABD。

A. 全局函数 - 全局函数不属于任何类,因此它们不能被声明为虚函数。虚函数是类的成员函数,用于实现多态。

B. 拷贝构造函数 - 拷贝构造函数不能被声明为虚函数。拷贝构造函数是在对象被复制时被调用的,它是非虚的,因为它的调用发生在对象的生命周期开始时,此时多态还无法发挥作用。

D. 私有成员函数 - 私有成员函数不能被派生类访问,因此它们不能参与多态机制,也就不能被声明为虚函数。

在C++中,下面哪些语句可以在派生类中重新定义基类的虚函数?

A  使用override关键字        B  使用virtual关键字        C  使用new关键字        D  不使用任何关键字

答:AD,主要是B选项有一定的争议,事实上使用virtual确实可以重新定义虚函数,但是virtual在设计上并不是为了重新定义虚函数,因此安全性不高。

在C++中,下面哪些语句可以在一个函数体内抛出异常?

A  throw        B  delete        C  return        D  try

答:AB。delete一个未分配的指针可能会抛出异常。try捕获异常的。

32.

C++中,以下哪个关键字用于在运行时检查类型信息?

A  dynamic_cast        B  static_cast        C  const_cast        D  reinterpret_cast

答:

在C++中,用于在运行时检查类型信息的关键字是:

A. `dynamic_cast`

`dynamic_cast`不仅用于类型转换,而且在转换过程中会检查对象的实际类型,确保转换的安全性。如果转换的目标类型不是对象的实际类型或基类类型,`dynamic_cast`会失败,并且如果用于指针转换,结果将是一个空指针;如果用于引用转换,将抛出`bad_cast`异常。

其他选项:

B. `static_cast` - 用于在不同类型间进行静态转换,没有运行时类型检查。

C. `const_cast` - 用于去除或添加`const`或`volatile`限定符,也不涉及运行时类型检查。

D. `reinterpret_cast` - 提供低级别的、可能不安全的类型转换,主要用于将一个类型的地址解释为另一种类型的地址,同样不涉及运行时类型检查。

因此,正确答案是A选项,`dynamic_cast`。

在C++中,下面哪种迭代器支持++和--操作,但不支持随机访问?

A  双向迭代器       B  前向迭代器        C  随机访问迭代器        D  输入/输出迭器

在C++中,支持++--操作但不支持随机访问的迭代器类型是:

答:A. 双向迭代器(Bidirectional Iterator)

双向迭代器允许你向前和向后移动,即支持++--操作,但不支持随机访问操作,如operator[]operator+=。这意味着你不能直接跳转到迭代器序列中的任意位置,只能通过多次调用++--逐步移动。

其他选项的说明如下:

B. 前向迭代器(Forward Iterator) - 只支持向前移动,即只支持++操作而不支持--

C. 随机访问迭代器(Random Access Iterator) - 支持所有迭代器操作,包括++--以及随机访问操作,如operator[]operator+=

D. 输入/输出迭代器(Input/Output Iterator) - 主要关注于输入和输出操作,通常不支持--操作。

因此,正确答案是A选项,双向迭代器。这类迭代器通常在如std::liststd::set等容器中使用。例如,std::list的迭代器是双向迭代器,你可以使用++--在列表元素间前后移动,但不能使用下标操作直接访问任意位置的元素。

在 C++ 中,当一个类定义了复制构造函数时,编译器会自动合成移动构造函数。

解析:错误。构造函数有三个,分别是默认构造函数(无参数)、移动构造函数、复制构造函数。

只要定义了非默认构造函数那么默认构造函数就不会自动合成。移动构造和复制构造这两个互斥,只要其中的任何一个构造函数被定义了,另一个的构造函数就不会自动生成。

下面哪些关键字可以用于修饰类的成员函数?

A  const        B  volatile        C  mutable        D  static

解析:

A. const - 用于指定成员函数不会修改对象的状态。如果一个成员函数被声明为const,那么它不能修改类的非mutable成员变量。这有助于提高代码的安全性和可读性。

C. mutable - 用于声明成员变量可以在const成员函数中被修改。通常用于那些需要在const成员函数中更新状态但不影响对象不变性的变量。

D. static - 用于声明静态成员函数,这些函数不属于任何特定的对象实例,而是属于整个类。静态成员函数没有this指针,因此不能访问类的非静态成员变量。

B. volatile - 通常用于修饰变量,表示该变量的值可能在任何时候发生变化,即使没有代码显式地修改它。volatile关键字通常用于硬件交互或其他需要特殊内存模型的情况。它不用于修饰成员函数。

下面哪些算法可以对容器进行排序?

A  std::sort()        B  std::stable_sort()        C  std::partial_sort()        D  std::nth_element()

解析:A. std::sort() - 用于对容器中的元素进行排序。std::sort() 不保证排序的稳定性,即相等元素的相对顺序可能会改变。

B. std::stable_sort() - 也用于对容器中的元素进行排序,但它保证排序的稳定性,即相等元素的相对顺序不会改变。这通常比 std::sort() 慢一些,但如果你需要保持相等元素的原始顺序,那么应该使用 std::stable_sort()

C. std::partial_sort() - 用于对容器的一部分元素进行排序。它只排序容器中的一部分元素,通常是前N个元素,其余元素的顺序不变。这对于找出前N个最小或最大元素非常有用。

D. std::nth_element() - 并不是一个排序算法,但它可以用于部分排序,即将第N个元素放置在正确的位置,使得前面的元素不大于它,后面的元素不小于它。这通常用于寻找中位数或快速选择算法。

下面哪些函数可以用于构造容器中的元素?

A  emplace_back()        B  push_back()        C  insert()        D  emplace()

解析:答案AD

A. emplace_back() - 用于在容器的末尾添加新元素,并在原地构造元素。这意味着构造函数直接在容器的末尾进行,而不是先构造一个临时对象再移动或复制到容器中。

D. emplace() - 与 emplace_back() 类似,但用于在容器的任何位置插入元素。它直接在容器中构造元素,而不是先构造一个临时对象。

B. push_back() - 用于将元素添加到容器的末尾。如果容器支持,它也可以接受一个 rvalue 引用作为参数,这意味着你可以传递一个临时对象或右值表达式,它会被移动到容器中。然而,它不直接在容器中构造元素。

C. insert() - 用于在容器中的指定位置插入一个元素。它可以接受一个 rvalue 引用作为参数,这意味着你可以传递一个临时对象或右值表达式,它会被移动到容器中。然而,它不直接在容器中构造元素。55

这是一条吃饭博客,由挨踢零声赞助。学C/C++就找挨踢零声,加入挨踢零声,面试不挨踢!

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值