C++面试常错问题摘要

Posted 絮雨清风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面试常错问题摘要相关的知识,希望对你有一定的参考价值。

1、指针和引用的区别

  1. 引用必须初始化,指针不必;
  2. 引用初始化后不可改变,指针可以改变所指对象;
  3. 不存在指向空值的引用,但是存在指向空值的指针;

2、实时系统的基本特性:在特定时间内完成特定的任务,实时性与可靠性。

3、全局变量存储在静态数据区,局部变量在堆栈中。

4、堆栈溢出一般是由于没有回收垃圾资源导致的。

5、构造函数不可声明为虚函数,析构函数可以声明为纯虚函数。

6、IP地址的编码包含:网络号和主机码。

7、Switch( )的参数类型不可以是浮点型。

8、如何引用一个已经定义过的全局变量

  1. 引用头文件:用引用头文件方式来引用某个在头文件中声明的全局变量。假定你将那个变写错了,那么在编译期间会报错
  2. extern关键字:如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

9、对于一个频繁使用的短小函数,C语言是用宏定义来实现,C++是用inline来实现。

10、C++不是类型安全的,因为两个不同类型的指针之间可以强制转换(reinterpret cast)。

11、一个空类A,sizeof(A)的值是1。这就是实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。

12、数组和指针的区别

  1. 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。而指针可以随时指向任意类型的内存块。
  2. 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。

13、C++函数中值的传递方式:值传递,指针传递,引用传递。

14、内存的分配方式

  1. 静态存储区:在编译时分配,整个运行期间都存在,如全局变量和常量;
  2. 栈上分配:函数内的局部变量,分配的内容有限;
  3. 堆上分配:也称动态分配,如new,malloc函数分配的存储空间。
15、extern “C”有什么作用?
        Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extern “C”后,C++就能直接调用C函数了。

Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。可以用一句话概括extern “C”这个声明的真实目的:实现C++与C及其它语言的混合编程。

16、用什么函数开启新进程、线程

        进程:CreateThread/AfxBeginThread等;

        线程:CreateProcess等。

17、SendMessage和PostMessage有什么区别

        SendMessage是阻塞的,等消息被处理后,代码才能走到SendMessage的下一行;

        PostMessage是非阻塞的,不管消息是否已被处理,代码马上走到PostMessage的下一行。

18、CMemoryState主要功能是查看内存使用情况,解决内存泄露问题。

19、#include <>和#include “”的区别

        #include <>,编译器从标准路径开始搜索;

        #include “”,编译器从用户工作路径开始搜索。

20、处理器标识#error的目的是什么?

        编译时输出一条错误信息,并中止继续编译。

21、#ifndef XXX #define XXX #endif 的作用是防止该头文件被重复引用。

22、在定义一个宏时需要注意什么?

        定义部分的每个形参和整个表达式都必须用括号括起来,以避免不可预料的错误发生。

23、数据在做函数实参的时候会转变成指针类型。

24、系统会自动打开和关闭的3个标准文件是:

  1. 标准输入——键盘——stdin
  2. 标准输出——显示器——stdout
  3. 标准出错输出——显示器——stderr

25、strcpy()和memcpy()的区别?

        Strcpy()和memcpy()都可以用来拷贝字符串,strcpy()拷贝以’\\0’结束,但memcpy()必须指定拷贝的长度。

26、说明define和const在语法和含义上有什么不同?

  1. #define是C语法中定义符号变量的方法,符号常量只是用来表达一个值,在编译阶段符号就被值替换了,它没有类型。
  2. Const是C++语法中定义常变量的方法,常变量具有变量特性,它具有类型,内存中存在以它命名的存储单元,可以用sizeof()测出长度。

27、字符常量和字符串常量的区别,并使用sizeof运算符计算有什么不同?

        字符常量是指单个字符,字符串常量以’\\0’结束,使用运算符sizeof计算出多占一字节的存储空间。

28、简述全局变量的优缺点

        全局变量也称为外部变量,它是在函数外部定义的变量,它属于一个源程序文件,它保存上一次被修改后的值,便于数据共享,但不方便管理,易引起想不到的错误。

29、总结static的应用和作用?
  1. 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
  2. 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函数访问;
  3. 在模块内的static函数只可被这这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内;
  4. 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
  5. 在类中的static成员函数属于整个类所拥有,这个函数不接受this指针,因为只能访问类的static成员变量。
30、总结const的应用和作用
  1. 欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没机会去改变它了;
  2. 对指针来说,可以指定指针本省为const,也可以指定指针所指的数据为const,或二者同时指定为const;
  3. 在一个函数声明中,const可以修饰形参,表名它是一个输入参数,在函数内部不能改变其值;
  4. 对于类的成员函数,若指定其为const类型,则表名其是一个常函数,不能修改类的成员变量;
  5. 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

31、什么是指针?对指针怎么理解

        指针是一个变量,该变量专门存放内存地址;

        指针变量的类型取决于其指向的数据类型,在所指数据类型前加“*”;

        指针变量的特点是它可以访问所指向的内存。

32、什么是常指针,什么是指向常变量的指针?

        常指针的含义是指针所指向的地址不能变,但该地址所指向的内容可以变化,使用常指针可以保证我们的指针不能指向其它的变量;

        指向常变量的指针是指该指针的变量本身的地址可以变量,可以指向其它的变量,但是它所指的内容不可以修改。、

33、函数指针和指针函数的区别?

        函数指针是指一个函数入口的指针;

        指针函数是函数的返回值是一个指针类型。

34、简述Debug和Release版本的额区别?

        Debug版本是调试版本,Release版本是发布给用户的最终非调试的版本。

35、statid函数与普通函数的区别?

        Statid函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

36、struct和union的区别?
  1. 结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员。
  2. 对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。

37、简述枚举类型

        枚举方便一定定义一组常量,使用起来很方便。

38、assert()的作用?

        assert()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式FALSE(0),程序将报错,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

39、局部变量和全局变量是否可以同名

        能。局部变量会屏蔽全局变量。

        要使用全局变量需要使用“::”(域运算符)。

40、程序的局部变量存放在堆栈中;全局变量存放在静态区中;动态申请数据存放在堆中。

41、什么时候使用常引用?

        如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。

42、类的声明和实现的分开的好处?

        起保护作用,提高编译的效率。

43、Windows消息系统由哪几部分构成?
  1. 消息队列:操作系统负责为进程维护一个消息队列,程序运行时不断从消息队列中获取消息、处理消息;
  2. 消息循环:应用程序通过消息循环不断获取消息、处理消息;
  3. 消息处理:消息循环负责将消息派发到相关的窗口上使用关联窗口过程函数进行处理。
44、什么是消息映射?

        消息映射就是让程序员指定MFC类(有消息处理能力的类)处理某个消息。然后由程序员完成对该处理函数的编写以实现消息处理功能。

45、什么是UDP和TCP,区别是?

        TCP全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。

        UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到点的通信。用TCP还是UDP,那要看你的程序注重哪一个方面,可靠还是快速。

46、构造函数的调用顺序是什么?

  1. 先调用基类构造函数
  2. 按声明顺序初始化数据成员
  3. 最后调用自己的构造函数。

47、extern ” C”的作用

        extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。

49、C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。

  1. 自动类型推断:auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,可以大大简化我们的编程工作。
  2. 返回值占位。

49、什么时候必须重写拷贝构造函数?

        答:当构造函数涉及到动态存储分配空间时,要自己写拷贝构造函数,并且要深拷贝。



以上是关于C++面试常错问题摘要的主要内容,如果未能解决你的问题,请参考以下文章

雅思英文常错词汇总结

python常错: join() 方法

面试题 01.03:URL化(C++)

智能指针实例

C++获取基类指针所指子类对象的类名

c++中内存拷贝函数(C++ memcpy)详解