数据库:
1.概念设计阶段,最常用的数据模型是(E-R模型)。
2.(事务)是DBMS的基本单位,它是构建单一逻辑工作单元的操作集合。
3.(模式)用来描述数据库全体数据的全局逻辑结构和特性。
4.要保证数据库的数据独立性,需要修改(三级模式之间的两层映射)。
5.关系数据模型的三个要素是(实体完整性)、(参照完整性)、(用户自定义完整性)。
6.关系代数运算中,专门的关系运算有(选择)、(投影)、(连接)。
7.T-SQL语言基本表的四个表级约束为(主键约束)、(外键约束)、(唯一性约束)、(检查约束)。
8.SQL中,与‘NOT IN’等价的操作符是(‘<>ALL’)。
9.要对数据库的一张表进行操作,同时要对另一张表进行操作,可以将操作多个表的操作放入到事务中进行处理。
10.若数据库日志满了,只能执行查询等读操作,不能执行更改、备份等写操作,原因是任何写操作都要记录日志。
其他
1.windows消息调度机制是(消息队列)。
2.CSingleLock用来同步多个线程对一个数据类的同时访问。
3.其他数据类型转换到CString可以用Format来转换,因此MFC中的CString不是类型安全类。
4.有关Const
1)在参数中使用const应该使用引用和指针,而不是一般的对象实例。
2)若一个成员函数不会修改数据成员,则最好声明为const,以防止对数据成员进行修改,提高健壮性。
3)当类中含有const成员变量,基类的构造函数都需要初始化成员列表。
4)const int a; a是一个常整型
const int *a; a是一个指向常整型的指针。指针能修改,整型不能修改
int *const a; a是一个常指针,执行一个整型变量。整型数可以修改,指针不能修改。
5)const作用
定义常量,修饰函数参数和返回值;修饰函数定义体,定义类中某个成员函数为恒态函数。
被const修饰的东西受到强制保护,可以预防意外的变动,提高程序健壮性。
6)与define的区别
编译器会对const常量进行类型安全检查,对宏常量只进行简单的替换,且在编译前就被替换掉了。
5.编译器自动对齐内存时为了提高程序性能。访问未对齐的内存处理器要做两次内存访问,而对齐的内存访问仅需一次。
6.使用线程池可以防止线程出现大的波峰,线程池可以同时提高调度效率和限制资源。线程池中的线程达到最大数时,其他线程就会排队等候。
7.有关栈
1)栈中存放(局部变量)、(函数参数)、(函数返回值)、(函数返回地址)。
2)对栈S操作:push(1),push(5),pop(),push(2),pop(),pop(),此时栈为空。
8.有关堆
1)new和malloc申请的内存在堆上。
9.负数在内存中的形式为整数取反加一。-1在内存中的形式为1111 1111,即0000 0001取反1111 1110加一1111 1111。
10.有关指针
1)若有函数max(a,b)且函数指针变量p已指向函数,当调用该函数时调用方法为(*p)(a,b)。
2)空指针不同于未初始化的指针,空指针可以确保不指向任何对象或函数,而未初始化的指针可以指向任何对象或函数。
3)回调函数就是一个通过函数指针调用的函数,如果把函数的指针作为参数传递给另一个函数,当这个指针被调用时,就是回调函数。
4)int (*(*f)(int ,int))(int),f是一个函数指针,指向一个有两个参数且返回值为函数指针的函数,返回的函数指针指向有一个参数且返回值为int的函数。
5)一个好的习惯,free后将指针置为NULL:str = NULL;
11.(void *)ptr和(*(void **))ptr值相同。
12.有关链表
1)数组和链表的区别为:数组数据顺序存储,固定大小,而链表可随机存储,大小可动态改变。
13.有关虚函数
1)纯虚函数:virtual void f()=0; 子类必须要实现。
14.有关宏
1)用宏定义求数组数据的元素个数:#define NTBL (sizeof(Array))/(sizeof(Array[0]))
2)判断一段程序是由C编译器还是C++编译器编译的:
#ifdef _cplusplus
cout<<"C++";
#else
cout<<"C";
#endif
3)定义一年中有多少秒: #define sec_per_year (365*24*60*60) UL
4)求两数中较小值:#define MIN(A,B) ((A) <= (B) ? (A) : (B))
5)将字母大写:#define Upcase(c) ( ((c) > "a" && (c) < "z") ? ((c) - 0x20) : (c) )
15.全局对象的构造函数会在main函数之前执行。
16.float 类型变量与0比较:if(a<0.000001 && a>-0.000001)。
17.打印当前源文件的文件名以及源文件的当前行号:cout<<_FILE_;cout<<_LINE_;
18.内存操作
1)申请内存时要判断是否申请成功,因为可能内存用完了没申请到。
2)给内存地址“0x12345678”赋值为0:long *p; p = (long*)0x12345678; *p = 0;
19.包含头文件,<>表示从标准库路径寻找和引用头文件;“”先从当前工作路径寻找并应用头文件,若没找到再从标准库中寻找。
20.关键字extern
1)是C/C++语言中表明函数和全局变量作用范围的关键字,它告诉编译器,其声明的函数和变量可在本模块和其他模块中使用。
2)C++中要声明const void f()函数为C程序的库函数,应在函数前添加extern “C”声明。
21.有关TCP/IP
1)TCP/IP协议的主要层次结构为:应用层、传输层、网络层、数据链路层、物理层。
22.其他协议
1)Internet物理地址和IP地址转换采用ARP地址解析协议。
21.用C编写死循环:while(1){} 或 for(;;){}
22.空类所占空间为1,多重继承的空类所占的空间也是1,虚继承涉及到虚表,大小为4。
23.数组作为参数传给函数时传的指向数组首地址的指针,fun( char[8] )、fun( char[] )、fun(char*)等价。
char var[10];
int test(char var[])
{
return sizeof(var); // 返回4
}
24.面向对象的基本概念;类、对象、继承。
25.C++中空类默认产生的类成员函数有:构造函数、析构函数、默认构造函数、赋值函数。
26.定义int z:33是错误的,z为整型变量,不能超过32位。
27.无符号型自减操作会引发死循环;看到unsigned char一定要想到其取值范围(0~255),运算是否越界。
28.switch语句中,break语句用于跳出switch语句,继续执行switch语句后的语句。
continue语句跳出循环体中尚未执行的语句,接着进行下一次是否执行循环的判断。
29.delete和new配套,删除一个指针,调用一次析构函数;delete[]和new[]配套,删除一个指针数组,调用每一个成员的析构函数。
30.有关static
1)static型变量存储在全局数据区;
2)未经初始化的静态全局变量会被程序自动初始化为0;
3)静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。
4)内存只分配一次,下次调用维持上次的值。
5)static型成员函数不接受this指针,只能访问static变量。
31.算术运算符>关系运算符>逻辑运算符>赋值运算符
32.判断是否2的N次方:x&(x-1)
二进制中1的个数:while(m){count ++; m=m&(m-1);}
33.delete和delete[]区别
delete删除一个指针,delete[]删除一个数组
delete删除用new分配的内存,delete[]删除用new[]分配的内存。
delete只会调用一次析构函数,delete[]会调用每一个成员的析构函数。
34.位操作
给定一个整型变量a,设置a的bit3: a|=(0x1<<3); 清除a的bit3: a&=~(0x1<<3);