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 ...
随机推荐
- Redis教程(三) list类型
一.概述: redis的list类型其实就是一个每个子元素都是string类型的双向链表.所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1) 另外list会记录链表的长度.所以ll ...
- php7 httpd 2.4 编译
1.获取源码httpd-2.4.23.tar.gz php-7.1.0.tar.gz,安装顺序必须是先安装http然后php,lnmp同理 2.安装编译环境和php.httpd依赖包,红色字体 ...
- apache虚拟主机访问原理
www.a.com www.b.org www.c.net 都放在10.0.0.10这个服务器上 那么客户访问这三个域名 服务器是怎么分辨访问的是哪个目录呢 GET http://download.m ...
- HTML5 中的Nav元素详解
什么是Nav元素 Nav元素可以用作页面导航的链接组,在导航链接组里面有很多的链接,点击每个链接可以链接到其他页面或者当前页面的其他部分,并不是所有的链接组都要被放在nav元素里面,我们只需要把最主要 ...
- i.
史上最全web.xml配置文件元素详解 一.web.xml配置文件常用元素及其意义预览 <!--servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立.修改和删除会话或 ...
- shell中创建mysql库和执行sql脚本
以前执行oracle脚本都是放到plsql中执行 mysql 脚本执行: (1).先创建一个worlddb库 (2).导入sql脚本: 这就ok啦,哈哈.
- trim(),正则表达式中文匹配
^[/u4E00-/u9FA5]+$ 匹配中文 验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$” 验证InternetURL:“^http://([ ...
- 好用的Magento一步支付插件One Step Checkout免费版
Magento免费版一步支付插件地址:http://www.magentocommerce.com/magento-connect/one-page-checkout.html 直接引用KEY:ht ...
- Win服务器常用批处理脚本
oracle数据库备份 先导出数据库,然后执行压缩,将源文件删除,保留压缩文件 exp crm/crm@orcl file=G:\数据库备份\CRM\CRM%DATE%.dmp owner=crm&q ...
- 断言(assert)的用法
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”. 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解 ...