选择题
1. 下面关于纯虚函数的说法,正确的是?
A. 析构函数不能是纯虚函数
B. 重写基类纯虚函数时函数的返回值类型必须保持不变
C. 纯虚函数可以是内联函数
D. 运算符重载函数不能是纯虚函数
2. 下面关于throw表达式的说法正确的是?
A. throw抛出指针时指向的对象类型可以是不完整类型
B. throw;可重抛当前异常,只能在catch块中使用
C. throw表达式可以出现在return语句中
D. 使用noexcept声明的函数中不能使用throw语句抛出异常
3. 已知Base *p = new Derived;
其中Base是Derived的多个公开非虚基类之一,且Base是多态类,
下面关于对p进行强制类型转换的表达式一定正确的是
A. static_cast<Derived *>(p) == static_cast<void *>(p)
B. const_cast<const Base *>(p) == dynamic_cast<void *>(p)
C. dynamic_cast<Derived *>(p) == dynamic_cast<void *>(p)
D. reinterpret_cast<Derived *>(p) == static_cast<Derived *>(p)
4. 下面关于内联函数(inline)的说法正确的是?
A. 内联函数拥有内部链接
B. 模板函数都是内联函数
C. 同一内联函数的函数指针在多个编译单元中不一定比较相等
D. constexpr函数都是内联函数
5. 下列关于运算符重载的说法正确的是?
A. 运算符重载函数的参数个数与该运算符的操作数个数相等
B. 重载operator delete函数参数列表只能有一个void *指针
C. 重载关系运算符的函数返回值类型不一定是bool
D. 重载函数调用运算符的函数可以是静态成员函数
6. 下列关于友元函数的说法正确的是?
A. 友元函数可以被继承
B. 友元函数不能是虚函数
C. 类模板内的声明的友元函数是函数模板
D. 通过友元声明首次定义的函数可以通过参数依赖查找进行引用
7. 下面关于RTTI的说法,正确的是?
A. 使用typeid前必须包含<type_info>头文件
B. typeid只能用于多态类型或表达式
C. typeid可以用于不完整类型
D. 已知dynamic_cast<D *>(p) != nullptr,则typeid(*p)==typeid(D)
8. 下面关于nullptr的说法中,错误的是?
A. nullptr是纯右值
B. nullptr是C++关键词
C. static_cast<int>(nullptr) == 0
D. nullptr == NULL
9. 已知using namespace std::literals;
下列关于用户定义字面量的说法正确的是?
A. +1s的类型是std::chrono::duration<int>
B. "van"s的类型是std::string
C. 11.4514min的类型是std::chrono::minutes
D. 4i的类型是std::complex<int>
10. 下面关于模板参数的说法正确的是?
A. 模板参数只能是类类型,不能是基本数据类型
B. 非类型模板参数的类型可以是指针
C. 模板参数列表中只能有一个变长模板参数,并且它必须位于模板参数列表最后
D. 模板参数不能是不完整类型
11. 以下哪个选项中的代码不是合法的C++表达式?
A. (0b1'00'01l)
B. (061'00'01i)
C. (06|'01'011)
D. (0b1'01'0|1)
12. 下面关于extern的说法,正确的是?
A. extern "C++" const int a; 拥有内部链接
B. extern "C" int b = 2; 拥有外部链接
C. extern template int c<int>(); 是模板显式实例化定义
D. extern和inline说明符不能同时使用
13. 下列不等式一定成立的是?
A. sizeof short < sizeof long
B. true + false < true + true
C. NULL < '0'
D. "hello" < "world"
14. 下面关于字符串的说法,正确的是?
A. std::string_view可以隐式转换为std::string
B. 字符串字面量是泛左值
C. std::stoi转换失败时会返回空字符串
D. 字符串字面量的类型是const char *
15. 在C++17中下面关于auto的语句,正确的是?
A. auto a(int());
B. template<auto> class b;
C. return new auto(*this);
D. int d(auto());
16. 以下关于static关键词的说法正确的是?
A. 若类Foo定义静态成员变量 static Foo instance; 则需要在某一编译单元的全局作用域中添加 static Foo Foo::instance; 类外定义以防止链接错误
B. C++标准确保静态局部变量一定会被初始化一次并且只会被初始化一次
C. 若定义某对象于全局作用域且未使用static说明符,则它一定拥有外部链接
D. 若静态局部变量被成功初始化,则它的析构函数会在程序正常退出时执行
17. 以下关于异常的说法正确的是:
A. 析构函数和operator delete重载函数隐含noexcept
B. throw; 语句可以重新抛出当前异常,它只能在catch块中使用
C. 构造函数的成员初始化列表中抛出异常,一定会调用当前对象的析构函数
D. new表达式只会抛出std::bad_alloc异常
18. 下列哪一项不是C++关键词?
A. mutable
B. override
C. operator
D. export
19. 下面关于拷贝的说法,正确的是?
A. 拷贝构造函数不能声明为explicit
B. 模板函数不能是拷贝构造函数
C. 拷贝赋值运算符重载函数不能是虚函数
D. 拷贝赋值运算符重载函数的参数不能按值传递
20. 下面关于运算符重载的说法正确的是?
A. operator?:不能被重载
B. operator&是二元运算符
C. 所有的成员访问运算符都不能重载
D. 重载operator!=后编译器会自动生成operator==
21. 下面关于this的说法正确的是?
A. this是纯右值,*this是左值
B. this不能在非静态成员函数中使用
C. this不能在成员初始化列表中出现
D. this指针出现在成员函数的首个参数
22. 下面关于lambda表达式的说法错误的是?
A. lambda表达式是纯右值
B. decltype([]{})表示的类型是void(*)()
C. lambda表达式拥有的闭包类型可以被继承
D. lambda表达式的函数体可以返回lambda表达式
23. 下面关于全局变量的说法,正确的是?
A. 全局变量构造函数抛出异常可以在main函数捕获
B. 全局变量析构函数一定会在程序终止时执行
C. 单个编译单元内全局变量的构造顺序是未指定的
D. 没有指定初始化的整数全局变量都是0
24. 下面关于constexpr的说法正确的是?
A. 调用constexpr函数一定会在编译期计算结果
B. constexpr函数声明隐含noexcept
C. constexpr函数是内联函数,并且不能取地址
D. constexpr静态成员变量是左值
25. 下面关于指针类型的说法正确的是?
A. 任意类型的指针都可以隐式转换为void *
B. 两个指针变量做减法的结果类型是std::ptrdiff_t
C. 数组变量作为实参传递时会退化为指向数组的指针
D. 指针类型都是随机访问迭代器
26. 下面关于std::bind的说法正确的是?
A. std::bind的返回值类型是std::function模板的实例
B. std::bind可以绑定类成员函数指针或类成员变量指针
C. std::bind返回的函数对象可以接受任意个数的参数
D. std::bind调用时每个绑定占位符(如std::placeholders::_1)只能使用一次
28. 下面关于new的说法正确的是?
A. 使用new int[N]分配数组时允许N==0
B. 全局operator new函数可以被重载,但是不能被显式调用
C. 调用new表达式只可能抛出std::bad_alloc异常
D. new T、new T()、new T{}是等价的
28. 以下使用标准库容器的操作,正确的是?
A. 已知vector<int> v; 使用v.swap(v);收缩已分配的内存
B. 已知map<std::string, int> m; 使用m[""]访问未在容器中的值
C. 已知list<int> l; 使用std::sort(l.begin(), l.end())进行排序
D. 已知array<float, 4> a; 使用a.erase(a.begin())删除头部元素
29. 在下面的结构体定义中去除一个成员变量,使得sizeof(Foo)最小
(假设为32位Windows环境,使用MSVC 19.26编译器)
struct Foo
{
char A;
int B;
short C;
long D;
};
30. 下面关于C++线程库的说法正确的是?
A. std::mutex的加锁和解锁的操作可以在不同的线程进行
B. 通过std::async得到的std::future对象析构函数会阻塞直到异步操作完成
C. 多个线程同时调用std::promise::set_value是线程安全的
D. 使用thread_local关键词前必须#include <thread>
31. 下面关于operator delete的说法中正确的是?
A. 在使用自定义的全局重载operator delete之前,必须#include <new>
B. 类特定operator delete重载函数必须添加static关键词声明为静态成员函数
C. 若基类声明了虚析构函数,则派生类重载的类特定operator delete也具有多态性
D. operator delete重载函数不能是友元函数
32. 下面关于函数模板和模板函数的说法,正确的是?
A. 函数模板不能全特化
B. 函数模板不能在函数体内声明
C. 模板函数的重载决议优先级低于非模板函数
D. 移动构造函数不能是模板函数
33. 以下哪个语句会得到和其他选项不一样的结果?
A. auto a(char());
B. auto a(char(0));
C. auto a(char{});
D. auto a(char{0});
34. 若x是变量,以下关于std::move的说法正确的是?
A. 必须要通过std::move才能把x转换为右值
B. std::move(x)返回右值,因此它不能出现在等号左边
C. std::move是函数模板
D. 定义变量 auto &&a = std::move(x); 则a是右值
35. 根据C++标准,下列关于sizeof(下称大小)的说法一定正确的是?
A. 派生类的大小 >= 其所有基类的大小之和
B. 在C++中所有种类的指针的大小都相等,且等于 sizeof(void*)
C.同一平台上内建bool类型的大小一定大于等于char类型的大小,即sizeof(bool) >= sizeof(char)
D. 联合体(union)的大小等于它所有的成员中占用空间最大的一个成员的大小
36. 下面关于联合体的说法正确的是?
A. 联合体可以继承联合体,但不能继承结构体
B. 联合体不能为空
C. 联合体不能有受protected访问控制的成员
D. 联合体模板可以偏特化
答案:
CCCDCDCCBBCBBBADABBAABDDBBAABB