1、以下关于抽象类的描述正确的是
A、不能实例化指向抽象类对象的指针或引用
B、抽象类的纯虚函数的实现可以由自身给出,也可以由派生类给出
C、可以实例化抽象类对象
D、抽象类的纯虚函数的实现由派生类给出
2、以下代码执行完成后i j的值是
int main() { int i = 0; int j = 0’ for (i = 10; i >= 0; --i) { for (j = 10; j == 1; --j) { i = j; } } }
A. -1 10
B. 0 0
C. -1 0
D.执行超时
回答错误,答案为 A
B 循环开始后j=10,j==1始终为false,因此只执行外层i循环
3、以下代码输出结果
int a = 12;
printf("%d %d\n", a--, a++);
A. 11 12
B. 12 12
C. 13 12
D. 不确定,与编译器有关
回答错误,答案为 D
4、可以在同一个类内部,声明如下
static void fun();
virtual void fun();
A、对
B、错
正确答案B,原因不知道,然后在代码中写了下,编译报错:error: ‘virtual void HppTest::fun()’ cannot be overloaded with ‘static void HppTest::fun()’
5、任何情况变量定义时都要初始化
A、对
B、错
正确答案B,解释:
使用变量之前应该给变量一个值,一个好的编译程序将帮助你发现那些还没有被给定一个值就被使用的变量。不过,变量不一定需要初始化。在函数外部定义的变量或者在函数内部用static关键字定义的变量(被定义在数据段中的那些变量,见2.1)在没有明确地被程序初始化之前都已被系统初始化为0了。在函数内部或程序块内部定义的不带static关键字的变量都是自动变量,如果你没有明确地初始化这些变量,它们就会具有未定义值。如果你没有初始化一个自动变量,在使用它之前你就必须保证先给它赋值。
调用malloc()函数从堆中分配到的空间也包含未定义的数据,因此在使用它之前必须先进行初始化,但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。
6、存在int 类型的x y 和 buf,以下关于sprint_f()用法正确的是
A、sprintf_s(buf, sizeof(buf), ,x,y)
B、sprintf_s(buf, sizeof(buf), ‘%d’ ,x,y)
C、sprintf_s(buf, sizeof(buf), ‘’ ,x)
D、sprintf_s(buf, sizeof(buf), ‘%d’ ,x)
回答错误,答案为 D
sprintf用的比较少,记录一下。
7、类的析构函数可以是虚函数,但构造函数不可以
A、对
B、错
正确答案A。
8、下面语句是声明的是
A、extern int Errno = 0;
B、int Errno;
C、extern int Errno;
D、extern void Reset() { /* … */ };
回答错误,答案为 C
9、以下可能会导致栈溢出的是
A.
std::string(1024*1024*1024, 1);
B.
std::array(int, 1024*1024*1024);
C.
std::vector<int>(1024*1024*1024, 1);
D.
char test[1024*1024*1024]
回答错误,答案为 BD
int arr char 栈空间 vector map set string 堆空间
其中A和B和C是什么意思?
盲猜一波,C是声明一个类型为int的vector,长度为1024*1024*1024,全部都初始化为1。
A是声明一个长度为1024*1024*1024的string,string的内容是1
B是声明一个类型为int的array,长度为1024*1024*1024。
上述猜测中,基本都猜对了,但是其中array比我想象的要复杂一些,就是array我之前是很少使用的,现在查了一下,对array的理解更多了一些。
查到了下面的一个帖子,说的比较详细。突破编程_C++_C++11新特性(array)
10、using typedef数组指针,指向数组的指针是
A.
typedef int (Array*)[10]
B.
using *Array = int[10]
C.
using Array = int(*)[10]
D.
typedef int (*Array)[10]
回答错误,答案为 CD
解释:int (*p)[10]; p即为指向数组的指针,又称数组指针。
问题探究,using用法
c++ using定义数组指针
在C++中,你可以使用
using
关键字来简化数组指针的声明。例如,如果你有一个指向整型数组的指针,你可以使用using
来为这个指针类型定义一个别名,然后使用这个别名来声明变量。下面是一个使用
using
定义数组指针类型的例子:#include <iostream> int main() { // 定义一个指向整型数组的指针类型别名 using IntArrayPtr = int (*)[10]; // 使用别名来声明一个指向具有10个整数的数组的指针 IntArrayPtr ptr; // 示例:为数组分配内存并初始化 int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; ptr = &array; // 示例:使用指针访问数组元素 std::cout << "第一个元素: " << (*ptr)[0] << std::endl; std::cout << "第二个元素: " << (*ptr)[1] << std::endl; return 0; }
11、针对下面代码片段说法正确的是
if (XXX)
doSome1();
if (YYY)
doSome2();
else
doSome3();
A、else和第一个if配对
B、else和第二个if配对
C、if、else的代码块都建议使用大括号,使得代码逻辑清晰,可读性好
D、else会和最近if进行配对
回答错误,答案为 BC
D 应该是最近未配对的 if
12、使用gdb调试程序,对于运行控制命令,下面描述正确的是
A、start与run作用相同
B、show args可以显示被调试程序运行时参数
C、start命令在main函数入口设置一个临时断点,启动或重新启动调试程序
D、set args [arg1, arg2, …] 可以改变被调试程序运行时参数
回答错误,答案为 BCD
默认情况,run指令会一直执行程序直到执行结束。如果程序中手动设置有断点,则run指令会执行程序至第一个断点
Start指令会执行程序至main()主函数的起始位置,即在main()函数的第一行语句处停止执行。
13、以下关于内联的说法,正确的是
A、在内联函数中,所有函数定义中的局部静态对象在所有翻译单元间共享
B、函数的内联替换会避免函数调用的开销(传递实参及返回结果),但它可能导致更大的可执行文件,因为函数体必须被复制多次
C、含有inline的函数一定会被内联展开
D、未包含inline的函数也可能被内联展开
回答错误,答案为 ABD
BCD 此题C选项需要注意,在内联函数中使用static,其实是类似全局变量的,即所有内联函数会公用这个static对象,所以不要在内联函数里面使用static对象
关于C选项: https://www.zhihu.com/question/45488363/answer/99426141
14、对于如下代码,说法正确的是
void Func(char * user, char * password) {
char input[1000] = {
0x00
};
int ret = 0;
if (fgets(input, sizeof(input) - 1, stdin) == NULL) {
/* handle error */
}
input[sizeof(input) - 1] = "\0";
ret = strcmp(usr, input);
// …
printf(input);
}
A、语句fgets(input, sizeof(input) - 1, stdin)可能会造成缓冲区溢出漏洞
B、当用户输入input是”%s%s%s%s%s%s%s%s%s%s%s”,就可能触发无效指针或未映射的地址,导致程序崩溃
C、解引用空指针是一种未定义的行为,而最有效的防止空指针解引用的方法就是在指针使用前做非空校验
D、代码的input直接来自用户输入,并作为格式化字符串直接传递给printf(),可能造成格式化漏洞
回答错误,答案为 BCD
15、关于typedef和using说法正确的是
A、using pStr = char*; const pStr p; 表示const char* p;
B、typedef char* pStr; const pStr p; 表示char* const p;
C、推荐使用typedef定义类的别名,更容易理解,代码简洁
D、推荐使用using定义类的别名,更容易理解,代码简洁
回答错误,答案为 BD
16、假设函数Foo返回类型为const A&,下列语句与 const A& r = Foo(); 等价的有
A、decltype(Foo()) r = Foo();
B、const auto& r = Foo();
C、auto& r = Foo();
D、auto r = Foo();
回答错误,答案为 ABC