C++笔试易错题集(持续更新)

1.如下代码输出结果是什么?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#include<stdio.h>

char *myString()

{

    char buffer[6] = {0};

    char *s = "Hello World!";

    for (int i = 0; i < sizeof(buffer) - 1; i++)

    {

        buffer[i] = *(s + i);

    }

    return buffer;

}

int main(int argc, char **argv)

{

    printf("%s\n", myString());

    return 0;

}

  • Hello
  • Hello World!
  • Well
  • 以上全部不正确

解析:

答案:D

函数char *myString()中没有使用new或者malloc分配内存,所有buffer数组的内存区域在栈区

随着char *myString()的结束,栈区内存释放,字符数组也就不存在了,所以会产生野指针,输出结果未知

2.


1

2

3

4

5

6

7

enum string{    

    x1,    

    x2,    

    x3=10,    

    x4,    

    x5,    

} x;

问x等于什么?(0)

在c语言中,这样写法一般是全局变量,程序初始化时会清零.

3.

设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为?


1

2

3

4

5

6

7

8

C c;

void main()

{

    A*pa=new A();

    B b;

    static D d;

    delete pa;

}

 

A B C D

A B D C(正确)

A C D B

A C B D

解析:

这道题主要考察的知识点是 :全局变量,静态局部变量,局部变量空间的堆分配和栈分配

其中全局变量和静态局部变量时从 静态存储区中划分的空间,

二者的区别在于作用域的不同,全局变量作用域大于静态局部变量(只用于声明它的函数中),

而之所以是先释放 D 在释放 C的原因是, 程序中首先调用的是 C的构造函数,然后调用的是 D 的构造函数,析构函数的调用与构造函数的调用顺序刚好相反。

局部变量A 是通过 new 从系统的堆空间中分配的,程序运行结束之后,系统是不会自动回收分配给它的空间的,需要程序员手动调用 delete 来释放。

局部变量 B 对象的空间来自于系统的栈空间,在该方法执行结束就会由系统自动通过调用析构方法将其空间释放。

之所以是 先 A  后 B 是因为,B 是在函数执行到 结尾 "}" 的时候才调用析构函数, 而语句 delete a ; 位于函数结尾 "}" 之前。

4.若char是一字节,int是4字节,指针类型是4字节,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

class CTest

{

    public:

        CTest():m_chData(‘\0’),m_nData(0)

        {

        }

        virtual void mem_fun(){}

    private:

        char m_chData;

        int m_nData;

        static char s_chData;

};

char CTest::s_chData=’\0’;

问:

(1)若按4字节对齐sizeof(CTest)的值是多少(12)?

(2)若按1字节对齐sizeof(CTest)的值是多少(9)?

请选择正确的答案。

解析:

答案分别是:12 和 9,对应C

考察点:c++ 类的内存布局。

上精华图:一张图说明类中成员变量,成员函数,静态变量与函数的空间位置。

理论如上,下面就是代码运行后真是执行结果。无pp无真相。这是4字节对齐,结果是12= 4(虚表指针)+1(char )+3(对齐补位)+4(int)

以下是1字节对齐,结果是9 =4(虚表指针)+1(char )+4(int)

5.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#include<iostream>

using namespace std;

class MyClass

{

public:

    MyClass(int i = 0)

    {

        cout << i;

    }

    MyClass(const MyClass &x)

    {

        cout << 2;

    }

    MyClass &operator=(const MyClass &x)

    {

        cout << 3;

        return *this;

    }

    ~MyClass()

    {

        cout << 4;

    }

};

int main()

{

    MyClass obj1(1), obj2(2);

    MyClass obj3 = obj1;

    return 0;

}

运行时的输出结果是()

  • 11214444
  • 11314444
  • 122444(正确)
  • 123444

解析:首先程序中存在三个MyClass对象。
前两个对象构造时分别输出1,2
第三个对象是这样构造的MyClass obj3 = obj1;这里会调用拷贝构造函数,输出2
然后三个对象依次析构,输出444
所以最终输出122444

MyClass obj3 = obj1;这里调用拷贝构造函数

如果是在这之前obj3,obj1都已声明,则此时调用的是coby assignment操作符

时间: 2024-08-25 00:17:29

C++笔试易错题集(持续更新)的相关文章

大学生活6 上课应该记笔记。应不应该有错题集?

个人观点.认为对,就做.认为错,就不做.即可 好记性不如烂笔头.上课应该记笔记,而且每一个必修,专业选修课程都应该有一个笔记本.有的人会说了,每个课程都有一个本子,那得多费钱呀.我说,不呀.你到网上买2,3块钱一个本子,课程笔记不建议你买厚的本子.为啥?你算一算,一学期有多少次课,每次课有几节,一节课你会记多少内容.你就会发现本子不需要太厚的. 每到期末考试阶段,有的同学就会说:史诗级灾难大片开始上演.为什么会出现这种现象?因为平时上课没有好好学习,作业不认真做,而且到了期末考试的时候发现自己手

node学习错题集

1.请求路径/favicon.ico 问题:node http.createServer()创建服务器,用户请求一次,但是服务器显示两次请求:一次为用户请求,一次请求路径为/favicon.ico ?? 代码如下: var http = require('http'); http.createServer(function(req,res){ console.log( req.url ); }).listen(8080);console.log("The server is on ...&quo

S2 深入.NET和C#编程 笔试测试错题积累

---恢复内容开始--- <深入.NET平台和C#编程>内部测试题-笔试试卷错题积累 1: 1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格式化器的Serialize()和Deserialize()方法可以分别用来实现序列化和反序列化过程 解析:BinaryFormatter c) 如果一个类可序列化,则它的子类和包含的各成员对象也一定可序列化 问题出在了子类,如果子类压根不能进行序列化操作,则会抛出异常 d) 标识一

C语言错题集

2018-10-02 C语言错题集 main 是一个合法的标识符吗? 答:是,main 是函数的标识符名称. 如果有符号常量定义如下: 1 #define F(n) 2*n 那么请问代码中 F(3+2) 的值等于多少? 答:F(3+2) == 2*3+2 == 8,注意,宏定义是在程序编译时先进行的预处理,做法是直接将标识符替换为常量,并不会进行相关运算.因此,直接将 F(3+2) 替换为 2*3+2. 我们说 printf() 是一个用于格式化打印的函数,那 sizeof() 是一个函数吗?

C# net core程序调试错误集(持续更新)

目录 C#程序调试错误集 1.依赖注入错误An unhandled exception has occurred while executing the request. 1.1 出错现象 1.1.1原因是net core在调用ValueController的时候,发现UnitOfWork没有进行依赖注入. 1.2 出错现象 1.2.1 原因是net core在调用UnitOfWork的时候,发现IPBoxContext没有进行依赖注入. 1.3 解决方法 C#程序调试错误集 1.依赖注入错误A

PAT乙级15分题易错题总结

PAT乙级15分题易错题总结 B1026 程序运行时间 输入格式: 输入在一行中顺序给出 2 个整数 C1 和 C2.注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [0,107]. 输出格式: 在一行中输出被测函数运行的时间.运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出:不足 1 秒的时间四舍五入到秒. 输入样例: 123 4577973 输出样例: 12:42:59 易忽略细节 在计算时,未能正确四舍五入,除100以后余数只要不为零都进位1.//er

Java五道输出易错题解析(进来挑战下)

收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注意下就OK了. 1. 看不见的空格? 下面的输出会正常吗? package basic; public class IntegerTest { public static void main(String[] args) { System.out.println(Integer.parseInt("1")); System.out.println(Integer.parseInt("?2"))

Java五道输出易错题解析(避免小错误)

收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注意下就OK了. 1. 看不见的空格? 下面的输出会正常吗? package basic; public class IntegerTest { public static void main(String[] args) { System.out.println(Integer.parseInt("1")); System.out.println(Integer.parseInt("2"));

数据结构——二叉树错题集

2-11 任何一棵二叉树的叶结点在先序.中序和后序遍历序列中的相对次序 遍历顺序 ,令所有遍历中的 根==NULL 遍历顺序都是 左右,即左节点先于右节点,不会改变顺序: 2-xx 先序序列遍历为 a b c d 的二叉树有多少个? 14 运用卡特兰算式 , n = 4 ,ans = C(n,2*n)/(n+1) = 14 1-5: 若一个结点是某二叉树的中序遍历序列的最后一个结点,则它必是该树的前序遍历序列中的最后一个结点. 错误: 特例: A-B-C 一条线上,C是根节点: 中序遍历:ABC