您的位置:首页 > 编程语言 > C语言/C++

C++

2015-10-24 22:23 162 查看
1:static的最主要功能是隐藏(因为所有未加static前缀的全局变量和函数都具有全局可见性),其次因为static变量存放在静态存储区,所以它具备持久性和默认值0

static全局变量与普通的全局变量有什么区别?两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

2.this指针作用:指向本身类实例的一个指针,this只能在成员函数中使用。全局函数、静态函数都不能使用this。可用来区分成员变量和参数同名问题

3.C++中 ,类和结构是只有一个区别的:类的成员默认是private,而结构是public。

结构体和联合体的区别:联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)

结构体用途:把不同类型的数据组合成一个整体---自定义数据类型

Struct与Union主要有以下区别:

1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。

2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的。

4. 变量的存储位置

一个由 c/c++编译过的程序占用的内存分为一下几个部分

    (1)、栈区 stack :存放函数的参数值,局部变量的值等。

    (2)、堆区 heap :由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。

    (3)、全局区(静态去)static : 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量又放在相邻的另一块区域中。程序结束后由系统释放。

4)、常量区 : 常量字符串放在这里。

    (5)自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。

malloc/free和new/delete的区别?

new 是c++中的操作符,malloc是c 中的一个函数

对于非内部数据类型(自定义)的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。而malloc则只分配内存,不会调用构造函数,同样free也不会调用析构函数;new 会调用类的构造函数,同理delete会调用类的析构函数,

new/delete的功能完全覆盖了malloc/free,C++不把malloc/free淘汰出局,是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

5. 引用与指针有什么区别?指针是一个实体,而引用只是变量的别名。

1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

2) 不存在指向空值的引用,但是存在指向空值的指针。

6.什么是平衡二叉树?

左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1

7.堆栈溢出一般是由什么原因导致的?没有回收垃圾资源

8.Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)

9.进程和线程的差别。

(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

10. 什么是可重入函数?C语言中写可重入函数,应注意的事项?

答案:可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果的正确性的函数。在编写可重入函数时通常要注意如下的一些问题:

尽量不要使用全局变量,静态变量,如果使用了应该注意对变量访问的互斥。通常可以根据具体的情况采用:信号量机制,关调度机制,关中断机制等方式来保证函数的可重入性。

11.两段代码共存于一个文件,编译时有选择的编译其中的一部分,请问如何实现?

答案:有两种简单的办法可以实现:在源码中使用条件编译语句,然后在程序文件中定义宏的形式来选择需要的编译代码。

在源码中使用条件编译语句,然后在编译命令的命令中加入宏定义命令来实现选择编译。

12.malloc()与 calloc()的区别?

答案:

1)参数上的区别

malloc (size_t size);

calloc (size_t n , size_t size);

malloc分配一块size大小的内存块,而calloc分配一个n*size大小的内存块

2)返回内存块的状态不同

malloc分配的内存块没有被清零,而calloc分配的内存块是清了零的。

13.包含预定义头文件< > 和" "的区别?

答案:< >只在指定的目录里寻找被包含文件;" "先在当前目录下查找 ,再在指定目录下查找;通常<>方式用于系统的头文件,而一般用户的头文件用" "的方式。

14.野指针if语句对它不起作用。“野指针”的成因主要有两种:

(1)指针变量没有被初始化。指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存.

char *p = NULL; char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL

15.C++中的Const用法

答:指针常量:char * const p(指向常量的指针); // 指针不可改,也就说指针只能指向一个地址,不能更改为其他地址,修饰指针本身

常量指针是这样声明的:(指针常量指向变量)

1)const int *p; 2)int const *p; // 所指内容不可改,也就是说*p是常量字符串,修饰指针所指向的变量

16.const常量与define宏定义的区别

答:(1) 编译器处理方式不同。define宏是在预处理阶段展开,生命周期止于编译期。

#define常量存在于程序的代码段。const常量是编译运行阶段使用,const常量存在于程序的数据段.

(2)类型和安全检查不同。define宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查。

(3) 存储方式不同。define宏不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)

#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。

17.i++ 相比 ++i 哪个更高效?为什么?

1)++i 比 i++效率高。

(2)i++要多调用一次类的构造和析够函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: