c/c++面试题(7)零碎知识总结
1.变量的声明和定义有什么区别?
声明:变量的声明做了两件事情
a.告诉编译器这个变量已经匹配到一块内存上了,下面的代码用到的变量或对象是在别处定义的.
声明可以出现很多次.
b.告诉编译器这个变量名已经被我占用了,其他的的变量将不能再使用.
定义:告诉编译器创建一个对象,为这个对象分配一块内存并给它取一个名字,这个名字就是常说的
变量名或对象名.同一变量或对象的定义只能出现一次.
本质区别:声明没有分配内存,而定义则是创建了对象并为这个对象分配了一块内存.
2.sizeof和strlen之间的区别?
a.sizeof是一个操作符,而strlen是一个库函数,使用需要包含<string.h>头文件.
b.sizeof的参数可以是数据类型或变量,而strlen函数只能以结尾为'\0'的字符串的作为参数.
c.编译器在编译的时候就计算出了sizeof的结果.而strlen函数必须在运行的时候才能计算出来.
d.sizeof计算的是数据类型占用的内存的大小,而strlen计算的字符串实际的长度,不包括'\0';
注意strlen在计算字符数组的时候,遇到0的时候和遇到'\0'的效果一样.
e.数组作为sizeof的参数不会退化,而作为strlen的参数的时候会退化为一个字符指针.
3.简要的说下static的用途.C语言关键字static 和 C++的关键字static之间的区别?
a.在C语言中static可以修饰局部变量,全局变量和函数.
static修饰的局部变量,改变了它的存储方式,由原来的栈区改变成静态区.实际上就是影响了它的
生命周期,作用域并没有改变.好处是具有继承特性,每次调用时候都要创建的开销.
static修饰的全局变量,改变了它的声明周期,但是存储方式并没有改变,普通的全局变量和静态的
全局变量都是在静态存储区域,只是改变了它的作用域.由原来的在整个源程序都可以使用到只有
定义它的那个源文件使用.
static修饰的函数也是改变它的作用域,static修饰的函数又叫内部函数;只能在本模块内使用,
而不能被其他的模块使用.
b.C++中除了上述的用途之外,static还可以定义类的成员变量和函数.
static定义的成员变量和函函数是隶属于类,而不是对象.所有的用类实例化的对象都共享
一份,访问static成员的时候有两种方式:一是通过类域解析::一个是通过实例化的对象.
C++的静态成员可以在多个对象间进行通信,传递信息.
4.C中的malloc/free和C++中new/delete之间的区别?
a.maloc/free是C的标准库函数,可以覆盖,但是不能重载,C和C++都可以使用.而new/delete是操作符,
可以重载,只能在C++中使用.
b.对于非内部的数据类型的对象而言,光用malloc/free是无法满足对象的要求的.对象在创建的时候需要
执行构造函数,对象在消亡之前需要执行析构函数.而malloc/free是库函数而不是运算符,不在编译器
的控制范围之内,编译器不能将执行构造函数和析构函数的任务强加给malloc/free.因此C++需要有一
个能够完成动态分配内存和初始化的new,以及一个能够完成清理和释放内存的运算符delete.
c.new的返回值是指定类型的指针,可以自动的计算所需要分配的内存的大小.而malloc的返回值是一个
void类型的指针,使用的使用要进行强制类型转换,并且分配的大小也要程序员的手动进行计算.
d.new/delete完全覆盖了malloc/free的功能,只所以还保留malloc/free,是因为我们在写C++程序的时候有
时会调用用C编写的代码,而C中又没有new/delete操作符.
e.new的时候做两件事情:内存被分配,为被分配的内存调用一个或多个构造函数构建对象.
delete的时候也是一样:为将要被释放的内存调用一个或多个析构函数,释放内存.
4.写一个标准的宏MIN,并说明下一个宏的一些用的注意事项?
#define MIN(a,b) ((a) < (b) ? (a) :(b))
调用的时候要注意它的副作用,例如
((++*p)<=(x)?(++*p):(x))这种三目操作符最好不要用来比较带有自增或自减的表达式,因为在运算的
过程式会多改变一次,就违背了原来的本意.
5.一个指针可以是volatile吗?
可以.因为指针和普通的变量一样也是一个变量,有时也会有变化程序的不可控制性.常见的例子:
子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针.
volatile修饰的指针通常是共享指针,通常是这个指针被多个服务共享的时候,这个时候就有可能
在编译器的检测能力之外改变它的值.
6.简述strcpy,sprintf,memcpy的区别?
char* strcpy(char* dest,const char* src);
int sprintf(char* str,cosnt char* format,...);
void* memcpy(void* dest,void* src,size_t n);
1.操作的对象不同,strcpy的两个操作对象均为字符串,sprintf的操作源对象可以是多种数据类型,
目的操作对象是字符串,memcpy的两个对象是两个任意类型的可以操作的内存地址,不限制
任何的类型.
2.执行的效率不同,memcpy最高,strcpy次之,sprintf效率最低.
3.实现的功能不同,strcpy主要实现字符串变量间的拷贝,它不检测边界.sprintf主要实现其他数据格式
到字符串之间的转换.memcpy主要是内存块间的拷贝.
7.设置地址为0x67a9的整型变量的值为0xaa66;
int* p = (int*)0x67a9;
*p = 0xaa66;
无论是什么平台地址长度和整型数据的长度都是一样的,即一个整型数据可以强制类型转换成地址
指针类型的只要有意义即可.
8.C++中的重载,覆盖,隐藏之间的区别?
a.重载(overload)的特征:函数名相同,同一作用域下参数列表不同的函数才形成重载.它对于返回类型
和是否是virtual函数没有关系.重载的功能就是同一函数名具有不同的行为.
b.覆盖(override)的特征:它指的是派生类的函数覆盖基类的函数,因此作用域不同.并且覆盖的要求
函数名相同,参数列表相同并且返回类型都必须相同.基类的成员函数必须是虚函数.
所谓的覆盖指的是:用基类对象的指针或引用访问虚函数根据实际的指向来实际的决定所调用的函数
c.隐藏(hide)的特征:隐藏指的是派生类的函数隐藏(屏蔽)了与其同名的基类的函数.在调用一个类成员函数的
时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了,那么就停止查找了.所以如果一个
派生类和它的基类都有同一个同名的函数,编译器最终选择派生类中的函数,那么就说派生类中的成员函数
隐藏了基类中的成员函数,也就是说它阻止了编译器继续向上查找的行为.
c/c++面试题(7)零碎知识总结的更多相关文章
- 【Python】 零碎知识积累 II
[Python] 零碎知识积累 II ■ 函数的参数默认值在函数定义时确定并保存在内存中,调用函数时不会在内存中新开辟一块空间然后用参数默认值重新赋值,而是单纯地引用这个参数原来的地址.这就带来了一个 ...
- 【Python】 零碎知识积累 I
大概也是出于初高中时学化学,积累各种反应和物质的习惯,还有大学学各种外语时一看见不认识的词就马上记下来的习惯,形成了一种能记一点是一点的零碎知识记录的癖好.这篇文章就是专门拿来记录这些零碎知识的,没事 ...
- Java英语面试题(核心知识篇)
Java英语面试题(核心知识篇) Question: What is transient variable?Answer: Transient variable can't be serialize. ...
- php获取服务器信息常用方法(零碎知识记忆)
突然整理下零碎小知识.......加深下印象: $info = array( '操作系统'=>PHP_OS, '运行环境'=>$_SERVER["SERVER_SOFTWARE& ...
- 通过面试题学习零散知识:Java面试题整理
一.如何看待面试题 对于喜欢学习的开发者来说,我们抛开工作和生活的时间,剩余的时间并不多,如果都用于学习的话,也不可能学的下所有感兴趣的技术点,精力也跟不上,我是深感如是.而面试题一般都是零碎的知识 ...
- Spring零碎知识复习
自学了Spring也有一段时间了,多多少少掌握了一些Spring的知识,现在手上也没有很多的项目练手,就将就着把这些学到的东西先收集起来,方便日后用到的时候没地方找. 1.spring的国际化 主要是 ...
- JAVA面试题相关基础知识
1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...
- 有关Spring注解@xxx的零碎知识
在Java的Spring开发中经常使用一些注解,例如 @XXX 等等,在网上看到收集整理碎片知识,便于懒人计划^=^... 过去,Spring使用的Java Bean对象必须在配置文件[一般为a ...
- python之零碎知识
一 join方法 主要是做字符串的拼接:join后面跟的类型必须是要可迭代得到对象 for循环的对象是可迭代对象 # result = "".join(li) # print(re ...
随机推荐
- js邮箱自动补全
邮箱自动补全js和jQuery html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- underscore源码解析 (转载)
转载出自http://www.cnblogs.com/human/p/3273616.html (function() { // 创建一个全局对象, 在浏览器中表示为window对象, 在Node.j ...
- z-index深入理解
[CSS深入理解之z-index]听课总结 (http://www.imooc.com/learn/643) 一.z-index基础知识 1.z-index的含义 z-index属性指定了元素及其 ...
- [HTML/HTML5]2 CSS样式表设置
2.1 在HTML文件中设置样式表 当前HTML"规则"指出:HTML仅用于标识页面的内容,应该使用样式表来定义内容的呈现样式.这不仅使Web页面对于所有用户(无论采用什么浏览器 ...
- Beam Search(集束搜索/束搜索)
找遍百度也没有找到关于Beam Search的详细解释,只有一些比较泛泛的讲解,于是有了这篇博文. 首先给出wiki地址:http://en.wikipedia.org/wiki/Beam_searc ...
- ie6兼容问题汇总
这几天在查找和解决网页在ie6下的兼容性问题花了我不少的时间,参考了网上的一些解决方法和自己做出来比较有效果的给大家参考一下,也方便我日后再用到: 1.IE的cache设置为Every visit t ...
- Windows下安装pip(转自http://www.cnblogs.com/yuanzm/p/4089856.html)
windows下面安装Python和pip终极教程 在大二的时候接触过一段时间的Python,最近又开始玩起了这门语言.总的来说,个人很喜欢Python的语言风格,但是这门语言对于windows并不算 ...
- solr索引服务器的配置和solrj集成开发总结
一.环境:solr6.2 + jdk1.8 + tomcat8 (solr不同版本需要最低的环境不同) solr6 需要至少jdk1.8 .对应的solr5+jdk1.7+tomcat7 实测 ...
- lex中yyrestart()的使用
使用lex&yacc时,如果文件有错,parse停止. "每次调用yyparse(),语法分析器会忘记上次分析可能拥有的任何状态而重新开始分析.这不像lex产生的词法分析器的yyle ...
- JVM 平台上的各种语言的开发指南
JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...