您的位置:首页 > 其它

笔试基础知识复习(一)

2014-05-13 00:18 239 查看
一、编程语言

1. C++指针

指针就是一个变量,专门存放内存地址,指针本身占4个字节(32位),特点是可以访问所指向的内存。

int **pr

int (*ptr)[3] //指针的类型是int(*)[3]

int *(*ptr)[4] //指针的类型是 int *(*)[4]

ptr++ //指针ptr的值加上了sizeof(int)

ptr + 5 //指针ptr的值加上了5*sizeof(int)

指针操作:赋值操作,加操作,减操作,相同类型的两指针相减

int **cc = new (int*)[10] //声明了一个10个元素的数组,数组的每个元素都是一个int*指针

复杂指针

(1) int (*func)(int *p)

(*func)()是一个函数,func是指向这类函数的指针,即函数指针。这类函数具有int* 类型的形参,返回值类型是int.

(2) int (*func)(int *p, int (*f)(int*))

func是一个指向函数的指针,这类函数具有int *和 int(*)(int*)这样的形参,f也是一个函数指针

(3) int (*func[5])(int *p)

func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int

(4) int (*(*func)(int*p))[5]

func是一个函数指针,这类函数具有int*类型的参数,返回值是指向数组的指针,所指向的数组的元素具有5个int元素的数组。

(5) int (*(*func)[5][6]))[7][8]

func是一个指向数组的指针,这类数组的元素是一个具有5x6个int元素的二维数组,而这个二维数组的元素有一个具有7x8个int元素的指针。

(6)int (*(*(*func)(int*)))[5])(int*)

func是一个函数指针,这类函数的返回值是一个指向指针数组的指针,所指向的数组的元素也是函数指针,指向的函数具有函数int*形参数,返回值为int.

所谓函数指针,就是指指向一个函数入口的指针,即这个指针存放着函数入口的地址。

函数指针只能指向具有相同返回值和相同参数的函数。

函数指针数组定义:void(*fun[3])(void*)

指向类A的成员函数的指针:void (A::*pmf)(char* const char*)

野指针

(1) 指针变量没有被初始化。

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

(3) 指针操作超越了变量的作用范围。所指向的内存值对象生命期已经被销毁。

2. C++引用

引用时每个对象(物体)的别名,主要用来描述函数的参数和返回值,而指针与一般的变量时一样的,会在内存中开辟一块内存区域。

当函数的参数或返回值是类的对象(物体)的话,采用引用可以提高程序的效率。

引用必须初始化,指针则不必;引用初始化以后不能改变,指针可以改变其指向对象。不存在指向空值的引用,当存在指向空值的指针。

C++中的3种传递方式:值传递、指针传递和引用传递。

3.C++ 中const的用法

与指针相关:

char greeting[] = “Hello”;

(1)char *p = greeting //p非const指针,

(2)char * const p //指针不可改变,也就是指针只能指向一个地址,不能更改为其他地址,修饰指针本身

(3)char const *p //指向内容不可改,也就是说*p是常量字符串, 修饰指针所指向的变量。

const char *p 和 char const *p是一样的。

(4)const char * const p //内容和指针都不能改

char const *const p 和const char * const p是一样的

总结:const出现在*号的左边,表示被指物是常量 char const *p

const出现在*号的右边,表示指针自身是常量 char * const p

const修饰函数参数是它最广泛的一种应用,表示函数体重不能修改参数的值。

const修饰类对象,表示对象为常量对象,它的任何成员都不能被修改

const修饰的对象(物体),该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的可能。

const修饰类的成员变量,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。static const的成员,需要在声明的地方直接初始化

const 修饰类的成员函数,则该成员函数不能修改类中任何非const成员,一般写在函数的最后面,来修饰;在该函数实现部分也要带const关键字。

const 类对象/指针/引用,只能调用类的const成员函数,因此const修饰成员函数的最重要作用就是限制对于const对象的使用。

const使用注意:

在参数中使用const应该使用应用或指针,而不是一般的对象实例

const在成员函数中的三种用法 (参数、返回值、函数)

不要轻易将函数的返回值类型定为 const;除非重载操作符外,一般不要将返回值类型定为队某个对象的const引用。

const和 define的区别:编译器处理方式不同 define在预处理阶段展开(不分配内存);const是在编译运行阶段使用。

4.函数重载

--------------面向对象知识-------------------

C++的空类(类别),默认的由哪些成员函数

class Empty

{

public:

Empty(); //默认构造函数

Empty(constEmpty&); //复制构造函数

~Empty(); //析构函数

Empty&operator=(const Empty& ); //赋值=运算符

Empty&operator&(); //取址运算符

const Empty* operator&()const; //取址运算符const

};

类和结构体的区别:权限不一样,且struct保证成员按声明顺序在内存中存储。

C++ 中的4种强制类型转换

(1) const_cast: 去掉类型的const或volatile属性

(2) static_cast: 用于基本类型之间和具有继承关系的类型之间转换(基类和子类)

(3) dynamic_cast: 把一个指向基类的指针或引用对象转换为继承类的对象,基类必须是虚函数。

(4) reinterpreter_cast:转换的类型必须是一个指针、引用、算术类型、函数指针或成员指针。用于将一个类型的指针,转换为另一个类型的指针。

面向对象的3个基本特征:

封装性: 客观事物抽象成类,对数据和方法进行public,private,protected

继承性: 继承概念可以实现方式有三类

(1) 实现继承:指的是使用基类的属性和方法,而不需要额外编码的能力

(2) 接口继承:指仅使用属性和方法的名称,但是子类必须提供实现的能力。

(3) 可视继承:指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

抽象类:仅仅定义之类创建的一般属性和方法。

多态性:允许你将父对象(物体)设置成为和一个或更多的它的子对象相等的技术,赋值后,父对象就可以根据当前赋值给它的子对象的特性,以不同的方式运作。允许将子类类型的指针赋值给父类类型的指针。

实现多态,有两种方式:

(1) 覆盖(子类重新定义父类的虚函数)

(2) 重载(允许存在多个同名函数,参数个数,类型不同)

5.类的覆盖 以及重载和隐藏

(子类重新定义父类的虚函数, 函数名相同,参数相同,基类函数必须有virtual关键字) 类与类之间

(允许存在多个同名函数,函数名相同,参数不同,类型不同,virtual关键字可有可无) 类内部

隐藏是指派生类的函数,屏蔽了与其同名的基类函数

(1) 派生类的函数与基类的函数同名,但是参数不同,不论有无virtual关键字,基类的函数将被隐藏。

(2) 派生类的函数与基类的函数同名,且参数也相同,但是基类函数没有virtual关键字,此时基类的函数被隐藏。

总之,重载,看参数;隐藏,用什么就调用什么;覆盖,调用派生类。

---类成员函数的overload(重载)、override(覆盖)、隐藏

6.多态

允许你将父对象(物体)设置成为和一个或更多的它的子对象相等的技术,赋值后,父对象就可以根据当前赋值给它的子对象的特性,以不同的方式运作。允许将子类类型的指针赋值给父类类型的指针。

多态类中的虚函数表:是在compile-time建立的,而不是在run-time建立的。各个虚函数这个时候被组织成了一个虚函数的入口地址数组

而对象的隐藏成员(虚函数表指针),是在运行期(run-time),也就是构造函数被调用时进行初始化的,这也是实现多态的关键。

7.虚函数

关键字 vitual

8.纯虚函数

9.STL

(1)Template 可以独立于任何特定类型编写代码,是范式编程的基础。

(2)模板主要用于STL中的容器、算法、迭代器等,以及模板元编程。

(3)可以创建动态增长和减少的数据结构;平台无关,可移植

10.C++内存管理

堆和栈的区别:

栈区(stack): 由编译器自动分配和释放,存放函数的参数值,局部变量,其操作类似于数据结构中的栈(后进先出)。

windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈的大小是2M。如果申请空间超过栈的剩余空间时,将提示overflow

栈由系统自动分配,速度较快,是程序员无法控制的。

在函数调用时,第一个进栈的是主函数中后的下一条指令的地址,然后是函数的各个参数。大多数C编译器,参数是由右向左入栈的,然后才是函数中的局部变量,主要静态变量时不入栈的。

堆区(heap):一般由程序员分配释放,如果程序员不释放,程序结束时可能被操作系统回收。这里需要注意的是,它和数据结构中的堆不是同一个回事,它的分配方式有点类似于链表,需要由程序员自己申请,并指明大小,在C语言中用函数malloc,C++有new运算符。

注意事项:

(1) 操作系统有一个记录空闲内存的地址链表,当系统收到程序申请时,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

(2) 堆是高地址扩展的数据结构,不是连续的内存区域,而链表的遍历方向是由地址向高地址。

(3) 堆得大小受限于计算机系统中有效的虚拟内存。

(4) 堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片。

(5) 一般在堆得头部用一个字节存放堆得大小。

1. 从静态存储区域分配:全局变量,static变量

2. 在栈上创建: 函数的内的局部变量,函数结束时存储单元自动被释放

3. 从堆上分配,亦称动态内存分配:用malloc或new申请内存后,应该判断指针是否为NULL,结束时使用free或delete是否,将指针设置为NULL,防止野指针。

要为数组和动态内存赋初始值。

内存分配中,memset,memcpy和strcpy的区别:

(1)memset: 用来对一段内存空间全部设置为某个字符,一般用于清零操作

(2)memcpy: 用来内存拷贝’\0’时结束拷贝。

(3) strcpy: 只能拷贝字符串。遇到

在编程中static关键字即可能多的使用,有好处!!

(1)在函数体内作用范围是该函数体,该变量内存只被分配一次,具有记忆能力

(2)在模块内的static全局变量可以被模块内所有函数访问,但是不能被模块外的其他函数访问。

11.C++输入输出

二、VC++

MFC,windows消息机制

三、数据结构

数据结构,二叉树,中序遍历,后续遍历,先序遍历

四、操作系统

进程和线程

(1) 线程是指进程内的一个可执行单元,也就是进程内的可调度实体。

1.1 调度

1.2 并发性:

1.3 拥有资源

1.4 系统开销
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: