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)零碎知识总结的更多相关文章

  1. 【Python】 零碎知识积累 II

    [Python] 零碎知识积累 II ■ 函数的参数默认值在函数定义时确定并保存在内存中,调用函数时不会在内存中新开辟一块空间然后用参数默认值重新赋值,而是单纯地引用这个参数原来的地址.这就带来了一个 ...

  2. 【Python】 零碎知识积累 I

    大概也是出于初高中时学化学,积累各种反应和物质的习惯,还有大学学各种外语时一看见不认识的词就马上记下来的习惯,形成了一种能记一点是一点的零碎知识记录的癖好.这篇文章就是专门拿来记录这些零碎知识的,没事 ...

  3. Java英语面试题(核心知识篇)

    Java英语面试题(核心知识篇) Question: What is transient variable?Answer: Transient variable can't be serialize. ...

  4. php获取服务器信息常用方法(零碎知识记忆)

    突然整理下零碎小知识.......加深下印象: $info = array( '操作系统'=>PHP_OS, '运行环境'=>$_SERVER["SERVER_SOFTWARE& ...

  5. 通过面试题学习零散知识:Java面试题整理

     一.如何看待面试题 对于喜欢学习的开发者来说,我们抛开工作和生活的时间,剩余的时间并不多,如果都用于学习的话,也不可能学的下所有感兴趣的技术点,精力也跟不上,我是深感如是.而面试题一般都是零碎的知识 ...

  6. Spring零碎知识复习

    自学了Spring也有一段时间了,多多少少掌握了一些Spring的知识,现在手上也没有很多的项目练手,就将就着把这些学到的东西先收集起来,方便日后用到的时候没地方找. 1.spring的国际化 主要是 ...

  7. JAVA面试题相关基础知识

        1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...

  8. 有关Spring注解@xxx的零碎知识

     在Java的Spring开发中经常使用一些注解,例如 @XXX 等等,在网上看到收集整理碎片知识,便于懒人计划^=^... 过去,Spring使用的Java Bean对象必须在配置文件[一般为a ...

  9. python之零碎知识

    一 join方法 主要是做字符串的拼接:join后面跟的类型必须是要可迭代得到对象 for循环的对象是可迭代对象 # result = "".join(li) # print(re ...

随机推荐

  1. winpcap抓包原理

    winpcap抓包原理 WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤.WinPcap 是 BPF 模型和 Libpcap 函数库在 ...

  2. Evolutionary Computing: 5. Evolutionary Strategies(2)

    Resource: Introduction to Evolutionary Computing, A.E.Eliben Outline recombination parent selection ...

  3. IO流中SequenceInputStream类

    SequenceInputStream类: 不断的读取InputStream流对象,对于使用Enumeration对象的情况,该类将持续读取所有InputStream对象中的内容,直到到达最后一个In ...

  4. 7 -- Spring的基本用法 -- 6...

    7.6 Spring 3.0 提供的Java配置管理 Spring 允许使用Java类进行配置管理,可以不使用XML来管理Bean,以及Bean之间的依赖关系. Interface :Person p ...

  5. 【Duke-Image】Week_3 Spatial processing

    Chapter_3 Intensity Transsformations and Spatial Filtering 灰度变换与空间滤波 Intensity transformation functi ...

  6. zoj 1788 Quad Trees

    zoj 1788 先输入初始化MAP ,然后要根据MAP 建立一个四分树,自下而上建立,先建立完整的一棵树,然后根据四个相邻的格 值相同则进行合并,(这又是递归的伟大),逐次向上递归 四分树建立完后, ...

  7. 关于c#调用java中间件api的几个问题

    由于项目需要,做的c#客户端数据库连接串首先肯定不能写死的程序里(数据库很容易被攻击,我们的项目半年改了几次密码...) 放置在配置文件内,都可以看得到,最开始想法将配置文件加密,老师说加密过的文件还 ...

  8. C++ map的遍历

    一般使用迭代器遍历比较方便. map<string,int> m; map<string,int>::iterator it; it = m.begin(); while(it ...

  9. 递归算法(三)——多项分布问题

    问题 一个枪手打靶,靶从外向内有1-10分(考虑脱靶得0分),打十枪,求枪手最后得90分的概率. 解决思路 一.穷举 考虑10重for循环,累计十次得分和为90者,求得概率.该法通用性差,效率低,但容 ...

  10. 一个网络传输框架——zeroMQ 调研笔记

    一.它是什么 zeroMQ,一个处理消息传输的库,重点在传输上,看起来它像是在socket上面封装了一层,让我们可以很容易的利用它来做N对M的数据传输,在分布式系统中很方便,在接收端它有round-r ...