C++软件开发,各种可能遇到的面试问题总结

时间:2024-04-13 21:04:32

这篇博文不分先后、不分轻重,只是简单的记录下可能在面试C++开发时遇到的各种问题,以及我想到的和参考的解答,解答不一定正确,仅供参考。

【printf()函数格式】

面试C++,无疑离不开被问到C语言的问题。先说一下printf()的格式吧。

参考官网资料,printf格式为  int printf ( const char * format, ... );而关键就在于这个 format 到底是什么样子的呢

官网原话是这么说的,A format specifier follows this prototype: %[flags][width][.precision][length]specifier 。

也就是说format格式是 %[flags][width][.precision][length]specifier 的。如我们平时用的 printf("%d",i); 就是一种格式。

先说一下specifier,下图为官网给出的不同指示符与对应的输出样式。

C++软件开发,各种可能遇到的面试问题总结

flags有5种:

- :左对齐(默认是右对齐的)

+ :强制显示正负号(默认是只有负数会显示负号,整数不显示的)

(space): 空格,如果是负数,显示一个“-”(负号),否则,输出一个空格。 这里说一下,不管你printf语句加几个空格,都至多输出一个。例:printf("% d",a); 如果a为 -3(负数), 输出“-3”,如果a为 3(非负数,包括0),输出“ 3”,这里不管你“%d”中间有几个空格,都只会输出一个。

#:输出8进制和16进制时才有效。#会被置换为“0”

0:当要求输出宽度为 width 时,不足的会在左侧补0,而不是空格。

width有两种:

(number):正整数,要求输出宽度至少为number。如若输出本身宽度已经大于number,则按实际输出。

*:相当于是占位符,需要自己给出输出的宽度。例:printf("%*.*f\n",10,4,1234.56); 该语句的意思为按%f格式输出1234.56,输出的宽度为10,精确到小数点后4位,语句中的两个“*”号由逗号后面的变量给出。

.precision有两种:

.precision 其实也好理解,小数点+数字,精确到小数点后几位。

(number):精确到小数点后 number 位

*:用法同width的*

将width与.precision合在一块边是 n.m ,宽度为n,精确到小数点后m位,很好理解。

C++软件开发,各种可能遇到的面试问题总结

length一般都是使用默认类型(none),简单说一下。

先说个例子,long long x = 10; printf("%lld",x); 该语句中的“ll”就是属于length段的。

平时我们输出int、char、double类型的变量都是不需要特别指出length段的,一般就是使用long long类型的输出时,会使用到“ll”,其他的不做过多解释。

C++软件开发,各种可能遇到的面试问题总结

 

【C与C++的各自特点与区别】

C特点:

1)面向过程的结构化语言,易于调试和维护;

2)表现和处理能力极强,可以直接访问内存的物理地址;

3)实现了对硬件的编程操作,也适合于应用软件的开发;

4)具有效率高,可移植性强等特点。

C++特点:

1)在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言

2)可以使用抽象数据类型进行基于对象的编程;

3)可以使用多继承、多态进行面向对象的编程;

4)可以担负起以模版为特征的泛型化编程。

区别:

最大的区别应该是,C语言是面向过程的结构化语言,C++是面向对象的结构化语言。

或者说C++是在C语言的基础上增加了面向对象程序设计的新内容,是对C语言的一次更重要的扩充和完善。

【C和C++内存分配问题】

C的内存基本上分为4部分:栈、堆、常量区和静态存储区。

在C++中内存分成5个部分:栈、堆、常量区、静态存储区和代码区。

内存区域 存储变量(常量)类型 分配释放方式 备注
函数内定义的非静态变量,通常是局部变量、函数参数等 编译器自动分配释放  
malloc、new 等分配的内存 需由程序员释放,否则程序结束时由OS回收  
常量区 常量(如字符串常量等),不允许修改 程序结束时释放 通过非正当手段也可以修改
静态区(全局区) 全局变量和静态变量 程序结束时释放 C中又分有无初始化,各放在一块区域,C++中已不区分有无初始化
代码区(.text段) 代码(如函数等),不允许修改,可以执行    

 

 

 

 

1)C++的多态:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来

调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数; 

存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是

和对象对应的;

多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性;

多态用虚函数来实现,结合动态绑定.;

纯虚函数是虚函数再加上 = 0; 

抽象类是指包括至少一个纯虚函数的类;

纯虚函数:virtual void fun()=0;即抽象类,必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容。

【参考资料】

1、printf()函数格式

2、C与C++的各自特点与区别