这篇博文不分先后、不分轻重,只是简单的记录下可能在面试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,下图为官网给出的不同指示符与对应的输出样式。
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位,很好理解。
length一般都是使用默认类型(none),简单说一下。
先说个例子,long long x = 10; printf("%lld",x); 该语句中的“ll”就是属于length段的。
平时我们输出int、char、double类型的变量都是不需要特别指出length段的,一般就是使用long long类型的输出时,会使用到“ll”,其他的不做过多解释。
【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;即抽象类,必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容。
【参考资料】