第一次c++笔试

汗颜基础题都不会(希望以此为教训)

(1)动态连接库的两种方式

答案:1)静态链接库需要.h文件,lib文件;   2)调用动态连接库包括(隐式调用和显示调用两种)

(2)进程和线程的区别

答案:进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

概念:

进程:是一段程序的执行过程(它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元);进程的执行离不开程序,进程中的文本区域就是代码区,也就是程序

线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,线程可以利用进程所拥有的资源,

多线程:在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。

多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率

最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。多线程的出现就是为了提高效率。

(3)指针和引用的区别

答案:

1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元

引用:跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已

nt a=1;int *p=&a;

int a=1;int &b=a;

上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单

元。

2)引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。

3)可以有const指针,但是没有const引用;

4)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

5)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

6)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。

7)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;

8)指针和引用的自增(++)运算意义不一样;

9)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏;

(4)高质量的c++编程防止头文件被重复引用

答案:

//moduleA头文件

#ifndef __MODULE_A_H //对于模块A来说,这个宏是为了防止头文件的重复引用

#define __MODULE_A_H

int fun(int, int);                //函数声明

#endif

//moduleA实现文件moduleA.C //模块A的实现部分并没有改变

#include"moduleA"

int fun(int a, int b)

{

return a+b;

}

(5)叙述下调用动态连接库的两种方式

答案:

(6)c++结构体与类的区别

答案:

struct能包含成员函数吗? 能!
struct能继承吗? 能!!
struct能实现多态吗? 能!!!
 

既然这些它都能实现,那它和class还能有什么区别?

最本质的一个区别就是默认的访问控制: 

默认的继承访问权限

struct是public的,class是private的。

“class”这个关键字还用于定义模板参数,就像“typename”。

(7)将字符串的大写转换成小写,举几个例子并说明用途

答案:第一次c++笔试

(8)#include<filename.h>和#include"filename.h"的区别

答案:

对于#include<filename.h>,编译器先从标准库路径开始搜索filename.h,使得系统文件调用比较快;

对于#include"filename.h",编译器先从用户的工作路径开始搜索filename.h,后去寻找系统路径,使得自定义文件较快。所以在写代码的过程中要根据实际情况选择是<>还是""

头文件的作用有哪些?头文件的作用主要表现为以下两个方面:

(1)**通过头文件来调用库功能**。出于对源代码保密的考虑,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口是怎么实现的,编译器会从库中提取相应的代码;

(2)**头文件能加强类型安全检查**。如果某个接口被实现或被调用时,其方式与头文件中的声明不一致,编译器就会指出错误,能大大减轻程序员调试、改错的负担。

(9)为防止头文件被重复引用,应当在头文件中加入什么语句

答案:#ifndef xx

          #define  xx

                            //函数声明

           #endif

(10)extend c的作用

答案:c++代码调用c语言代码、

           c++的头文件中使用、

            在多人协同开发时,有可能有的人擅长c语言,有的人擅长c++这样情况会用到。

能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。