static:修饰变量,只能初始化一次,修饰函数是指此函数只能在本文件中调用
const:定义常量;可以进行类型检查
switch(c)中c唯独不可以是float类型
volatile:为了解决多线程共享导致的变量值的不一致,规定每次读取变量值时候从内存中去读取。
ASSERT()一般称为断言,它是一个调试程序时经常用到的宏,它定义在<assert.h>头文件中,通常用于判断程序是否出现了非法的数据。使用assert()的缺点是频繁的调用会极大的影响程序的性能。
枚举变量:enum{a,b=5,d,c=4,e};在枚举中,某个枚举变量的值为默认为前一个变量的值加1,而如果第一个枚举变量没有赋值,则其默认值 为0.
命令行参数:int main(int argc,char * argv[])
c++中不是所有的动作都是由mian()函数引起的
对操作符的优先级总结如下:
1.关系操作符优于逻辑运算符。
2.移位运算符介于算术运算符和关系运算符之间。
3.除单目运算符外,算术运算符的优先级最高。
a++后缀表达式不能做为左值,应为a++返回的是编译器自动分配的临时变量temp
与0值的比较:
1.!var--------逻辑判断
2.var==0------数值比较
3.var==NULL---判断指针
无论是float还是double类型的变量,由于它们在内存中的存储机制与整型数不同,有舍入误差,所以在计算机中,大多数浮点数都是无法精确表达
new/delete与malloc/free的区别
1.new能够自动计算需要分配的内存空间,而malloc需要手工计算字节数。列如,int*p1=new int[2],int *p2=malloc(2*sizeof(int))
2.new与delete带具体的类型的指针,而malloc与free返回void类型的指针。列如:char*p=(char *)malloc(100)
3.new一般有两部组成,分别是new操作和构造。new操作对应malloc,new操作将调用构造函数,而malloc不能,delete将调用析构函数,而free不能
4.malloc/free需要库文件stdlib.h支持,new/delete则不需要库文件支持
c++中用export关键字来实现模板函数的外部调用
c++中关键字explicit表示不允许隐试转换的发生。
回调函数就是指被调用者回头调用的函数,它是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另外一个函数,当这个指针被用为调用它所指向的函数时候,此时就可以称它为回调函数。回调函数不是由该函数的实现方直接调用的,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
内存分配:
一个c/c++编译的程序所占用的系统内存一般分为以下几个部分的内容:
1.由符号起始的区块(Block Started by Symbol,BSS)段;BSS段通常是用来存放程序中为初始化的全局数据和静态数据的一块内存区域
2.数据段(data segment):数据段通常用来存放程序中已经初始化的全局变量的一块内存区域
3.代码段(code segment/text segment): 代码段有时候也叫文本段,通常是指用来存放程序执行代码(包括类成员函数和全局函数以及其他函数代码)的一块内存区域,这部分区域在程序运行前就已经确定了,并且在内存区域中通常是只读的,
4.堆(heap):堆用于存放进程运行中被动态分配的内存段,它的大小并不固定,可以动态扩张或缩减。
5,栈(stack):栈用户存放程序临时创建的局部变量,一般包括函数括弧{}中定义的变量(但不包括static声明的变量,staticn意味着在数据段中存放变量)
栈是向地地址扩展的数据结构,是一块连续的内存的区域,栈顶的地址和栈的最大容量是系统预先规定好的,在windows下,栈的大小是2MB,而申请堆空间的大小一般小于2GB,堆是动态分配的内存的,并且可以分配使用很大的内存,使用不好会产生内存泄露。频繁地使用Malloc和free会产生内存碎片(类此磁盘碎片)
内存泄露(未能释放的内存)----失去控制
缓冲区溢出是目前导致“黑客”型病毒横行的主要原因。
c语言一共有32关键字和5中语言类型
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
需要注意的是,由于预处理指令的结尾不能添加分号,所以预处理指令不是语句
strlen-----不包括‘/0’,执行的是一个计数的工作。
sizeof是类型的大小,
大部分编译程序的sizeof都是在编译时候计算的,所以可以通过sizeof(x)来定义数组的维数,而strlen的计算则是在运行期计算的,用来计算字符串的实际长度,不是类型真用内存的大小。
一般而言,struct的sizeof是所有成员对齐后长度相加,而union的sizeof是取最大的成员长度。
野指针是指指向不可用内存的指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其默认值是随机的,所有指针变量在创建的同时也应对被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放置不理,否则就会成为野指针,而同时由于指针被释放(free或delete)后,未能将其设置成为NULL,也会导致该指针变为野指针。虽然free和delete把指针所指的内存给释放掉了,但它们并没有把指针本身也释放掉了。
为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL,程序里可以写P==0或者p==NULL,
预处理只要是进行文本代码的替换。
如何判断一个数是有符号数还是无符号数:
1.取反,都大于0是整数,。。
2.通过符号位来判断,将最高位置成1,然后判断A是否大于0(A=A|(1<<31))
不用sizeof,如何求出int占用的字节数:(char *)(&Value+1)-(char *)&Value
c语言中的struct是用户自定义数据类型,它是没有权限设置的,它只能是一些变量的集合体,虽然可以封装数据却不可以隐藏数据,而且成员不可以是函数。‘
具体而言,在c++中,class和struct做类型定义时候只有两点区别:首先是默认权限,class继承默认是private继承,而struct继承默认是public继承;其次是class还用于定义模板参数,就像typename,但是关键字struct不用于定义模板参数。
二进制是现代计算机发展的基础,所有的程序代码都需要转换成最终的二进制代码才能执行,合理地进行二进制的位操作,对于编写优质代码,特别是嵌入式应用软件开发非常关键。
位操作求两个数的平均值:(x&y)+((x^y)>>1)-----------原理:每个二进制都可以分解为各个各位与其权的乘积的和
位操作计算数的绝对值:(x^y)-y 其中y表示x右移31位
编译器一般使用堆栈来实现函数调用,堆栈是存取器的一个区域,嵌入式环境有时需要程序员自己定义一个数组作为堆栈。Windows为每一个线程自动维护一个堆栈,堆栈的大小可以设置。编译器使用堆栈来存放没个函数的参数,局部变量等信息。
全局变量和静态全局变量的区别在于作用域不同 就是说一个项目里如果有多个源程序文件 非静态全局变量可以在所有源文件里调用 静态全局变量只能在本文件里调用,不允许在其他文件里调用
一个有10个指针的数组,该指针指向一个整型数--------------------------------------------------------------------------------------------------------int *a[10]
一个指向有10个正型数数组的指针--------------------------------------------------------------------------------------------------------------------------int (*a)[10]
一个指向函数的指针,该函数有一个整型参数并返回一个整型数-------------------------------------------------------------------------------------int (*a)(int)
一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数---------------------------------------------------int (*a[10])(int)
在c/c++程序设计中,任何变量在使用前都需要定义或声明,定义是为了变量分配存储空间,还可以为变量指定初始值,在一个程序中,变量有且仅有一个定义。
而声明是指向程序表明变量的类型和名字。定义也是声明。如果程序前面都没有出现过a这个变量,这时候要使用a,就必须要让程序知道使用a这个变量,这时候写入int a,以前没有a这个变量的,现在程序为了记住它,就得为它分配空间,于是这是个定义。
一般为了叙述方便,吧建立存储空间的声明叫定义,而不把建议存储空间的声明成为声明。
不使用第三方变量,交换两个变量的值:
1.加减法
a=a+b
b=a-b
a=a-b
2.异或发
a=a^b
b=a^b
a=a^b
c++中全局对象、变量的构造函数调用顺序是跟声明有一定关系的,即在同一个文件中先声明的先调用。
C语言中各变量的默认初始值是:
全局变量存放在全局数据区,有编译器建立,如果在定义的时候不做初始化,则系统将自动为其初始化,数值型为0,字符型为NULL,即0,指针型变量也被初始化为NULL。静态变量的情况和全局变量类似。而对非静态变量如果不显示初始化,那么其内容是不可预料的,将是随机数,会很危险,对系统的安全造成非常大的隐患。
字符串是编程语言的基础,对于字符串的处理一直是程序设计的重要组成部分,所以在面试笔试中,经常会考察字符串处理函数的机理。掌握常见的字符串处理函数的原理,并能自己实现其原型,对于应对程序员面试笔试非常重要。
在多道程序环境中,要想将用户源代码变成一个可以在内存中执行的程序,通常可以分为3个步骤:编译,链接,载入
编译:经过词法,语法分析、语义分析以及优化后编译成若干个目标模块
链接:有链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的载入模型,链接主要解决模块间相互引用问题,分为地址和空间分配,符号解析和重定位几个步骤。
载入:由载入程序将载入模块载入内存
友元函数不是成员函数,但是它可以访问类中的私有成员,
当一个类中有指针类型的成员变量时候,一定要重写复制构造函数和复制构造函数,不能使用默认的。
初始化列表和函数初始化的区别:
对于非内置类型成员变量,因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进行函数体之后,进行的是对已经构造好的类对象的赋值,又调用一个复制赋值操作符才能完成(如果并未提供,则使用编译器提供的默认成员赋值行为)。为了避免两次构造,推荐使用类构造函数初始化列表。
有些情况下只能使用初始化列表:比如const对象或引用类型只能初始化,不能对它们赋值。
在c++中哪些情况下只能用初始化列表而不能用赋值:
在c++中,赋值和初始化列表的原理是不一样的,赋值是删除原值,赋予新值,初始化列表开辟空间和初始化是同时完成的,直接给与了一个值。
1.当类中含有const常量和引用成员变量时候,只能使用初始化不能对它们赋值,常量不能被赋值,只能被初始化,所以必须在初始化列表中完成,c++引用也一定要初始化,所以必须在初始化列表中完成
2.基类的构造函数都需要初始化列表,构造函数的意思是先开辟空间然后为其赋值,只能算是赋值,不算初始化。
3.成员类型是没有默认构造函数的类,若没有提供显示初始化,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试用于默认构造函数将会失败
因为构造函数没有返回值,所以通知对象的构造失败的唯一方法就是在构造函数中抛出异常。
c++中空类会产生哪些成员函数:(6个)
默认构造函数,赋值构造函数,析构函数,赋值运算符重载函数,取地址运算符重载函数,const取地址运算符重载函数
虚函数:
指向基类的指针在操作它的多态对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数,虚函数用virtual修饰函数名,虚函数的作业是在程序运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数进行重新定义。在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型(参数类型的顺序也要一致),以实现统一的接口,如果在派生类中没有对虚函数重新定义,则继承其基类的虚函数。
虚函数的使用可以大大地提高软件开发的效率,虚函数是通过一张虚函数表(Virtual Table)来实现的,该表是一个类的虚函数的地址表,解决了继承、覆盖的问题、保证它能真实反应实际的函数。c++编译器能够保证虚函数表的指针存在于对象实例中的最前面的位置,通过对象实例的地址得到这张虚函数表,然后就可以遍历其中的函数指针,并调用相应的函数。虚函数的本质就是通过基类访问派生类定义的函数。
对于纯虚函数,编译器要求在派生类中予以重载以实现多态性。含有纯虚函数的类称为抽象类,抽象类不能生产对象。纯虚函数永远不会被调用,它们主要用来统一管理子类对象。
基类的构造函数/析构函数是不能被派生类继承的,派生类中需要声明自己的构造函数。
什么函数不能声明为虚函数:
1.只有类的成员函数才能说明为虚函数
2.静态成员函数不能为虚函数,应为调用静态成员函数不需要实例,但调用虚函数需要从一个实例中指向虚函数表的指针,这样就矛盾了
3,内联函数不能为虚函数
4.构造函数不能为虚函数
5.析构函数可以为虚函数,而且通常声明为虚函数
虽然虚函数很有效,但是不可以把每个函数都声明为虚函数,因为使用虚函数是需要付出代价的,由于每个虚函数的对象在内存中都必须维护一个虚函数表,因此在使用虚函数时候,尽管带来了使用方便,却会额外产生一个系统开销。
c++中可以通过使用抽象类,或者将构造函数声明为private阻止一个类被实例化。
用一条语句实现判断x是否为2的若干次幂的判断:x&(x-1)判断为不为0
逗号表达式的运算过程是从做往右,逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值
数据库
sql server不区分大小写
oracle默认是区分大小写
请熟悉常见的sql语句的操作
内连接值显示复合连接条件的记录,外链接出了显示符合连接条件的记录外,还显示左表中的记录
事务是数据库中一个单独的执行单元(unit),它通常由高级数据库操作语言(如SQL)或编程语言(如c++,java)书写的用户程序的执行所引起的。
事务必须满足4个属性:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)即ACID4种属性。
一般情况下,通过执行COMMIT或ROLLBACK语句来终止事务。
存取过程:实现编译好的为了完成某特定功能的sql语句(为了提高效率)。
死锁产生4个必要的条件:1.互斥 2,请求和保存等待 3,不可剥夺 4,环路等待
数据库
sql server不区分大小写
oracle默认是区分大小写
请熟悉常见的sql语句的操作
关于数据库几种范式的理解
1,第一范式 数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
2,第二范式 在第一范式的基础上,第二范式要求数据库表中的每个实例或行必须可以被惟一地区分。 如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系R 是属于第二范式的。
3,第三范式 如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递信赖,则称关系R是属于第三范式的。
BCNF:如果关系模式R(U,F)的所有属性(包括主属性和非主属性)都不传递依赖于R的任何候选关键字,那么称关系R是属于BCNF的。或是关系模式R,如果每个决定因素都包含关键字(而不是被关键字所包含),则RCNF的关系模式。
内连接值显示复合连接条件的记录,外链接出了显示符合连接条件的记录外,还显示左表中的记录
事务是数据库中一个单独的执行单元(unit),它通常由高级数据库操作语言(如SQL)或编程语言(如c++,java)书写的用户程序的执行所引起的。
事务必须满足4个属性:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)即ACID4种属性。
一般情况下,通过执行COMMIT或ROLLBACK语句来终止事务。
存取过程:实现编译好的为了完成某特定功能的sql语句(为了提高效率)。
死锁产生4个必要的条件:1.互斥 2,请求和保存等待 3,不可剥夺 4,环路等待
在并发环境下,一般可以采用多种机制来保证数据的一致性,例如oracle系统提供的事务级的一致性、行级锁、表级锁等
索引是一种提高数据库查询速度的机制,它是一个在数据库的表或视图上按照某个关键字段的值,升序或降序排序创建的对象。
游标:提供了一种对从表中检索的数据进行操作的灵活手段。它实际是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
数据备份有:完全备份,差异备份,事务日志备份,增量备份