1.面向对象技术的基本概念是什么,三个基本特征是什么?
答:基本概念:类、对象、继承; 基本特征:封装、继承、多态。
封装:将低层次的元素组合起来形成新的、更高实体的技术;
继承:广义的继承有三种实现形式:实现继承、可视继承、接口继承。
多态:允许将子类类型的指针赋值给父类类型的指针
2.什么是多态?多态有什么作用?
答:多态就是将基类类型的指针或者引用指向派生类型的对象。多态通过虚函数机制实现。多态的作用是接口重用。
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数
3.进程间如何通信?
答:信号、信号量、消息队列、共享内存
4.在网络编程中涉及并发服务器,使用多进程与多线程的区别?
(1)线程执行开销小,但不利于资源管理和保护;进程则相反,进程可跨越机器迁移。
(2)多进程时每个进程都有自己的内存空间,而多线程间共享内存空间;
(3)线程产生的速度快,线程间通信快、切换快;
(4)线程的资源利用率比较好;
(5)线程使用公共变量或者资源时需要同步机制
5.请讲述堆和栈的区别。
(1)申请方式不同。栈上有系统自动分配和释放;堆上有程序员自己申请并指明大小;
(2)栈是向低地址扩展的数据结构,大小很有限;堆是向高地址扩展,是不连续的内存区域,空间相对大且灵活;
(3)栈由系统分配和释放速度快;堆由程序员控制,一般较慢,且容易产生碎片;
6.应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?
答:对于一个进程的内存空间而言,可以在逻辑上分成 3个部份:代码区,静态数据区和动态数据区。
动态数据区一般就是“堆栈”。 栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。
全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
7.C++函数中值的传递方式有哪几种?
答:三种传递方式为:值传递、指针传递和引用传递
8.指针和引用的区别
1、引用在创建时必须初始化,引用到一个有效对象,不是对象,不占用内存空间;而指针在定义时不必初始化,可以在定义后的任何地方重新赋值,是对象,占用内存空间。
2、指针可以是NULL,引用不行。
3、引用貌似一个对象的小名,一旦初始化指向一个对象,就不能将其他对象重新赋值给该引用,这样引用和原对象的值都会被更改。
9.堆栈的区别
1、管理方式不同
栈是编译器管理,堆的占用和释放都是由程序员进行控制的;
2、空间大小不同
在32位系统下,一般堆的内存可以达到4G的空间,可以说堆内存几乎是没有限制的。但是对于栈,一般都有一定空间大小(跟编译器有关),比如在VC6下默认的栈空间大小是1M
能否产生碎片不同。
对于堆来说,频繁的new/delete操作会造成内存空间的不连续,从而造成大量碎片,使程序效率降低;但是对于栈来说,因为总是先进后出不存在内存块不连续的问题。
3、生长方向不同
堆的生长方向是向上的,即向着内存地址增加的方向;
栈的生长方向是向下的,即向着内存地址减小的方向增长。
4、分配方式不同
堆总是动态分配的,需要程序员手动释放;栈存在静态分配和动态分配的:其中静态分配是由编译器完成的(比如局部变量的分配);动态分配是由alloca函数进行分配的(这个函数会在栈帧的调用处上分配一定空间,当调用alloca的函数返回到调用位置时,这些临时空间会被自动释放),栈的动态分配是由编译器自己进行释放的。
5、分配效率不同:
栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,包括:分配专门的寄存器来存放栈的地址、入出栈都有专门指令,因此栈的效率会比较高。
堆是C/C++函数库提供的,其机制非常复杂,比如为了分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果找不到(可能是因为内存碎片过多),就可能调用系统功能区(用户模式和内核模式的切换)增加程序数据段的内存空间,如此便有机会分到足够大小的内存,然后进行返回。
10.C++多态
动态分为静态和动态多态,静态多态又分为函数重载
静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,没有的话就会发出警告或者报错。
动态多态: 显然这和静态多态是一组反义词,它是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。
动态多态的条件:
●基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。
●通过基类对象的指针或者引用调用虚函数。
11.那些函数不能定义为虚函数?
1)友元函数,它不是类的成员函数
2)全局函数
3)静态成员函数,它没有this指针
3)构造函数,拷贝构造函数,以及赋值运算符重载(可以但是一般不建议作为虚函数)
12.虚函数
用virtual 关键字修饰的成员函数,就是虚函数。
在某基类中把成员函数声明为 virtual ,并在一个或多个派生类中重新定义。实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
13.引用和指针的区别
本质:引用是别名,指针是地址
指针可以再运行的时候改变其所指向的值,引用一旦和某个对象绑定就不能再改变;
从内存上看,指针会分配内存区域,而引用不会,它仅仅是一个别名;
在参数传递时,引用会做类型检查,而指针不会;
引用不能为空,指针可以为空。
14.进程线程区别