C/C++
C篇
1.1 指针
指针是一个占四字节的变量,与其他变量的不同就在于它的值是一个内存地址,指向内存的另一个地方。C语言适合底层开发就在于支持指针,能够直接访问内存地址和操作底层的数据,可以通过指针动态分配和释放内存。
* 数组
int *a[10] //指针数组,int (*a)[10] //数组指针,char str[] //字符串数组,char *str,**str //字符指针,指向字符串的指针
int const *a 或 const int *a //指针常量,指针指向的值不能变,int *const a //常量指针,指针本身不能变
数组是常量指针,int a[10]中a等价于int *const a,a不能变。
* 引用
引用是没有指针语法的指针,提供对对象的间接访问,为所指对象的一个别名。引用必须初始化,总指向它最初的对象,而指针可以被重新赋值。
1.2 位运算(&、|、^、~、<<、>>)a.将第n位置位或清零:
b.清除整数a最右边的1:a&(a-1)
c.将一个证书对齐到n:a=(a+n-1)&~(n-1)
1.3 运算符优先级
扩建点,单算易比较,胃饥三等点
1.4 数据对齐
a.自然对齐(各成员变量存放的起始地址相对于结构的起始地址偏移量的sizeof(类型)整数倍;整体结构是最大sizeof(类型)的整数倍)
b.强制对齐(#pragma pack())
1.5 实数:浮点数形式表示
1.6 整数:原码/反码/补码,低位优先/高位优先
1.7 字符
a.ASCII与UNICODE(utf-8)
b.char与wchar_t(宽字符)
c.ANSI_STRING与UNICODE_STRING(宽字符串):通过字符串的长度判断结束
1.8 溢出:数组溢出、数溢出、缓冲区溢出(strcpy,strcat,strintf)、栈溢出(存放局部变量)、指针溢出(野指针)
1.9 变量
全局变量、static变量(静态存储区)的生命周期为整个程序运行期;局部变量(堆栈)在调用后系统自动回收变量所占内存。
1.10 预编译 #pragma
#pragma message("..."),#pragma code_seg("INIT"),#pragma hdrstop,#pragma resource "*.dfm"
1.11 位域
1: typedef struct _demo{
2: int a:4;
3: int b:4;
4: int c:2;
5: }demo;
1: class Nothing{
2: };
3: class Nothing{
4: public:
5: Nothing();
6: Nothing(const Nothing& rhs);
7: ~Nothing();
8: Nothing& operator=(const Nothing& rhs);
9: };
1: class String{
2: public:
3: String& operator =(const String &other);
4: private:
5: char *m_data;
6: };
7: String& String::operator =(const String &other){
8: if(this==&other) return *this;
9: deleteb [] m_data;
10: int length=strlen(other.m_data);
11: m_data=new char[length+1];
12: strcpy(m_data,other.m_data);
13: return *this;
14: }
2.3 继承和多重继承
virtual虚继承避免了基类的多重拷贝。
2.4 多态与虚函数
多态:从基类派生出来的类所定义的对象对于同一个消息进行不同的操作。
虚函数:编译器遇到virtual后自动执行动态联编,为virtual函数的类建虚函数表vtable,运行时再决定使用哪个函数。
1: class Shape{
2: public:
3: Shape();
4: virtual double Area()=0;
5: }
6: class Circle:public Shape{
7: public:
8: Circle(int r){
9: m_r=r;
10: }
11: double Area(){
12: return 3.14*m_r*m_r;
13: }
14: private:
15: int m_r;
16: }
17: class Rect:public Shape{
18: public:
19: Rect(int x,int y){
20: m_x=x;
21: m_y=y;
22: }
23: double Area(){
24: return m_x*m_y;
25: }
26: private:
27: int m_x;
28: int m_y;
29: }
30: void main(){
31: Shape *p1=new Circle(1);
32: Shape *p2=new Rect(2,3);
33: cout<<p1->Area()<<p2->Area()<<endl;
34: }
2.5重载(重整)与重写
重载:允许多个同名函数,根据不同的参数调用不同的函数
重写:派生类中方法覆盖基类的方法
2.6 STL模板库
序列容器:vector,list,deque
关联容器:set,map
适配器:stack,queue,priority_queue
迭代器:iterator
常用算法:sort(),reverse(),find(),copy()
vector:数组,连续内存,支持[]操作符,支持尾部操作。
list:链表,非连续内存,不支持[]操作符,支持任意位置操作。
deque:队列,支持头部和尾部操作,支持[]操作符。
set:红黑树,自动排序,multiset允许重复元素。
map:红黑树,键值对(key-value),multimap允许键重复。
stack:栈,默认容器deque
queue:队列,默认容器deque
2.7 智能指针:auto_ptr,shared_ptr,自动清理内存。
2.8 a=++i等价于i=i+1,a=i;a=i++等价于a=i;i=i+1