笔试基础知识复习(一)
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 系统开销
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 系统开销
相关文章推荐
- JAVA基础知识复习面试笔试宝典
- JAVA多线程基础知识复习一
- JAVA多线程基础知识复习二
- JavaSE复习之二 基础知识:面向对象 补充(1)
- 找工作笔试面试补充基础知识(1)---内存对齐
- JavaSE复习之四 基础知识:集合 补充(1)
- JAVA基础知识复习5
- JAVA基础知识复习7
- 数据库基础知识复习
- 用《叩响C#之门》复习C#基础知识 第十章 面向对象编程:多态性
- POSIX 消息队列基础知识复习,以及相关例程
- 基础知识复习二 --- 指针(Jun18)
- 黑马程序员—java基础复习—基础知识
- Java基础知识复习
- 软件测试基础知识复习
- JavaSE复习之五 基础知识:接口
- C++基础知识面试笔试准备
- javascript基础知识复习2-javascript的继承
- c#基础知识复习
- SQL复习一(基础知识)