└── README.MD /README.MD: -------------------------------------------------------------------------------- 1 | # CPP-Quiz 2 | 考虑到编程语言有进入高考的倾向,特制作一系列C++题库供参考练习。 \ 3 | 以下题型如无特别说明均使用C++11标准。 \ 4 | 为了大家的刷题体验这里暂不提供答案。 \ 5 | 如有疑问请提ISSUE \ 6 | 欢迎大佬前来PULL REQUEST 7 | 8 | ## 警告:本题库 ~~难度较低~~ 不适合新手入门,请谨慎入坑。 9 | 10 | 11 | ### 1 ★★ (重载函数和右值引用) 12 | 已知声明 ` auto &&p = nullptr; ` \ 13 | 若以下重载函数声明同时存在,则f(p)会调用的函数是? \ 14 | A. ` void f(std::nullptr_t &&); ` \ 15 | B. ` void f(int); ` \ 16 | C. ` template void f(T *); ` \ 17 | D. ` template void f(T &&); ` 18 | 19 | ### 2 ★★ (变量的定义和初始化) 20 | 已知变量x的定义: 21 | ``` 22 | static int x = (x+3)/2+1/2; 23 | ``` 24 | 则定义后x的值是? \ 25 | A. 0 \ 26 | B. 1 \ 27 | C. 2 \ 28 | D. 4 29 | 30 | ### 3 ★★☆ (auto与模板实参推导) 31 | 关于语句 32 | ``` 33 | auto &&x = std::max(0.5, 1); 34 | ``` 35 | 请问以下说法正确的是? \ 36 | A. decltype(x)表示的类型是double && \ 37 | B. x是将亡值 \ 38 | C. 运行时x将会在语句结束后成为悬垂引用 \ 39 | D. 这段代码会引发一个编译错误 40 | 41 | ### 4 ★ (左值、纯右值、将亡值的概念) 42 | 已知定义 43 | ``` 44 | int x; 45 | int f(); 46 | int &&y=f(); 47 | ``` 48 | 以下哪个表达式是纯右值? \ 49 | A. x \ 50 | B. y \ 51 | C. f \ 52 | D. f() 53 | 54 | ### 5 ★ (列表初始化) 55 | 以下哪个选项会得到和其他选项不一样的结果? \ 56 | A. ` auto a(char()); ` \ 57 | B. ` auto a(char(0)); ` \ 58 | C. ` auto a(char{}); ` \ 59 | D. ` auto a(char{0}); ` 60 | 61 | ### 6 ☆ (默认构造函数) 62 | 以下哪个语句不能正确用默认构造函数创建对象(类型为T)? \ 63 | A. T a; \ 64 | B. auto b = T(); \ 65 | C. T c{}; \ 66 | D. T d(); 67 | 68 | ### 7 ★ (std::map和范围for循环) 69 | 已知定义 70 | ``` 71 | std::map kv; 72 | ``` 73 | 则范围for循环 74 | ``` 75 | for(auto x:kv){} 76 | ``` 77 | 中x的静态类型是? \ 78 | A. std::pair \ 79 | B. std::pair \ 80 | C. std::pair \ 81 | D. std::pair::iterator 82 | 83 | ### 8 ★☆ (命名空间和前置声明) 84 | ``` 85 | namespace X { 86 | struct Y { 87 | void foo(struct Z *); 88 | }; 89 | } 90 | ``` 91 | 中前置声明的Z是? \ 92 | A. X::Y::foo::Z(foo的局部类) \ 93 | B. X::Y::Z(Y的嵌套类) \ 94 | C. X::Z(在X命名空间内和Y并列) \ 95 | D. ::Z (在全局命名空间) 96 | 97 | ### 9 ★★ (函数、数组、指针的const限定) 98 | 假如已有别名 ` typedef float vec3_t[3]; ` \ 99 | 再定义函数 ` float VectorLength(const vec3_t v); ` \ 100 | 请问得到的函数签名是? \ 101 | A. VectorLength(const float *const v) \ 102 | B. VectorLength(float * const v) \ 103 | C. VectorLength(const float * v) \ 104 | D. VectorLength(float * v) 105 | 106 | ### 10 ★ (C++11综合) 107 | 已知定义 ` int a,b,c,d; ` 下列语句能为a,b,c,d分别赋值0的是? \ 108 | A. ` [&](){a=b=c=d=0;}; ` \ 109 | B. ` std::tie(a, b, c, d) = std::make_tuple(0, 0, 0, 0); ` \ 110 | C. ` for(auto &x : {a,b,c,d}) { x=0; } ` \ 111 | D. ` struct A { int &x; int &y; int &m; int &n; }; A {a, b, c, d} = { 0, 0, 0, 0 }; ` 112 | 113 | ### 11 ★★ (sizeof) 114 | 根据C++标准,下列关于sizeof(下称大小)的说法一定正确的是? \ 115 | A. 派生类的大小 >= 其所有基类的大小之和 \ 116 | B. 在C++中所有种类的指针的大小都相等,且等于 ` sizeof(void *) ` \ 117 | C. 同一平台上内建bool类型的大小一定大于等于char类型的大小,即` sizeof(bool) >= sizeof(char) ` \ 118 | D. 联合体(union)的大小等于它所有的成员中占用空间最大的一个成员的大小 119 | 120 | ### 12 ★☆ (指针和强制类型转换) 121 | 以下关于C++中指针的说法正确的是? \ 122 | A. 内建指针类型都是整数类型,且 ` std::is_integral::value == true ` \ 123 | B. 在C++中对内建指针进行(C风格)强制类型转换后,指针的值不变 \ 124 | C. 假如p是某内建指针类型(非void *)的变量,则 ` *p ` 一定是左值 \ 125 | D. 已知声明 ` extern Base *p; ` 若 ` dynamic_cast(p) ` 能通过编译则Derived和Base之间一定有继承关系 126 | 127 | ### 13 ★★ (不完整类型) 128 | 在C++11中,以下关于不完整类型的说法正确的是? \ 129 | A. 函数返回值类型不能是不完整类型,但可以是指向/绑定不完整类型的指针或引用类型 \ 130 | B. 模板实参可以是不完整类型,也可以是指向/绑定不完整类型的指针或引用类型 \ 131 | C. 有作用域枚举声明 ` enum class Color : int; ` 中 Color 是不完整类型 \ 132 | D. 所有的不完整类型都可以通过再次给出定义从而变得完整 133 | 134 | ### 14 ★(std::array的初始化) 135 | 在c++11中,以下哪种初始化是错误的? \ 136 | A. `std::array arr1d_1{ 1, 2, 3 };` \ 137 | B. `std::array arr1d_2{ { 1, 2, 3 } };` \ 138 | C. `std::array, 3> arr2d_1{ { {1,2,3}, {1,2,3}, {1,2,3} } };` \ 139 | D. `std::array, 3> arr2d_2{ {1,2,3}, {1,2,3}, {1,2,3} };` 140 | 141 | ### 15 ★★☆ (C++关键词) 142 | 语法填空:在空缺处____填入一个C++关键词使得代码可以编译通过。 143 | ``` 144 | ("", std::string()) + ________ + (std::string(), ""); 145 | ``` 146 | 147 | ### 16 ★★ (extern、static和链接性) 148 | 假设全局作用域有以下a的声明/定义。请问哪个选项所声明/定义的a具有和其他选项不同的链接性? \ 149 | A. ` const int a = 0; ` \ 150 | B. ` extern const int a = 0; ` \ 151 | C. ` static const int a = 0; ` \ 152 | D. ` extern "C++" { const int a = 0; } ` 153 | 154 | ### 17 ★ (逻辑运算符和类型特征计算) 155 | ``` 156 | #include 157 | #include 158 | int main() 159 | { 160 | std::cout << 161 | std::is_class::value || std::is_function>::value << 162 | std::is_pointer::value && std::is_scalar::value << 163 | '\n'; 164 | } 165 | ``` 166 | 请问该代码会得到什么输出结果? \ 167 | A. 0 \ 168 | B. 1 \ 169 | C. 10 \ 170 | D. 11 171 | 172 | ### 18 ☆ (异常处理) 173 | ``` 174 | #include 175 | #include 176 | 177 | int main() 178 | { 179 | try { 180 | throw nullptr; 181 | } 182 | catch(std::shared_ptr){ 183 | return 0; 184 | } 185 | catch(void *) { 186 | return 1; 187 | } 188 | catch(std::nullptr_t) { 189 | return 2; 190 | } 191 | return 3; 192 | } 193 | ``` 194 | 请问该代码会得到什么样的返回值(exit code)?\ 195 | A. 0 \ 196 | B. 1 \ 197 | C. 2 \ 198 | D. 3 199 | 200 | ### 19 ★☆ (static关键词) 201 | 以下关于static关键词的说法正确的是? \ 202 | A. 若类Foo定义静态成员变量 ` static Foo instance; ` 则需要在某一编译单元的全局作用域中添加 ` static Foo Foo::instance; ` 类外定义以防止链接错误 \ 203 | B. C++标准确保静态局部变量一定会被初始化一次并且只会被初始化一次 \ 204 | C. 若定义某对象于全局作用域且未使用static说明符,则它一定拥有外部链接 \ 205 | D. 若静态局部变量被成功初始化,则它的析构函数会在程序退出时执行 206 | 207 | ### 20 ★ (异常处理) 208 | 以下关于异常的说法正确的是:\ 209 | A. 析构函数和operator delete重载函数隐含noexcept \ 210 | B. ` throw; ` 语句可以重新抛出当前异常,它只能在catch块中使用 \ 211 | C. 构造函数的成员初始化列表中抛出异常,一定会调用当前对象的析构函数 \ 212 | D. new表达式只会抛出std::bad_alloc异常 213 | 214 | ### 21 ☆ (类型计算) 215 | 请问 ` decltype(throw) ` 所表示的类型是? 216 | 217 | ### 22 ★☆ (智能指针) 218 | 以下关于shared_ptr的说法错误的是?\ 219 | A. shared_ptr的拷贝构造和析构过程是线程安全的 \ 220 | B. shared_ptr的赋值(` operator= `)和读取(` get() `)过程是线程安全的 \ 221 | C. shared_ptr可以指向全局变量 \ 222 | D. shared_ptr析构时所指向的类型T可以是不完整类型 223 | 224 | ### 23 ★ (友元) 225 | 以下说法正确的是?\ 226 | A. 友元关系可以继承,但不可以传递 \ 227 | B. 类模板中声明的友元函数是函数模板 \ 228 | C. 通过友元声明首次定义的函数可以通过ADL查找进行引用 \ 229 | D. 若`class X`先前是不完整类型,则可以使用 ` friend class X {}; ` 的形式提供X的定义 230 | 231 | ### 24 ★☆ (引用的生命周期) 232 | 以下哪一项不会产生悬垂指针/引用? \ 233 | A. `auto &&a = std::move(std::string("miao"));` \ 234 | B. `auto &&b = std::forward(std::string("miao"));` \ 235 | C. `auto c = std::move(std::string("miao").c_str());` \ 236 | D. `auto d = std::forward(std::string("miao").c_str());` 237 | --------------------------------------------------------------------------------