1.判断一个数是不是2^n
用 x&(x-1) 如果是则x&(x-1) =0
2.求x+y 和 x+y = 2(x&y) +x^y
3.位运算实现加法器
int Add(int x, int y)
{
return 2(x&y)+x^y;
}
4. 不用if ?: switch 找两个数中的大数
return a<b? b: a; #include <cmath> ( (a+b)+ abs(a-b) )/2
5. 将a,b数值交换 不用中间变量
a=a+b; b=a-b; a=a-b; 交换整型和浮点型数值的变量
a=a^b; b=a^b; a=a^b; 交换整型
a=a*b; b=a/b; a=a/b; b!=0; 交换整型和浮点型数值的变量
6. 求a b c中间数字
if(a>=b)
{
if(c<=b)return
b;
else
if(a<=c)return a;
else
return c;
}
else
{
if(c<=a)return
a;
else
if(b<=c)return b;
else
return c;
}
7. 在C++程序中调用C的函数要在函数后加上extern "C", 因为C++中支持函数重载
头文件中加入#ifndef #define #endif
8. C是一种结构化语言重点在于算法跟数据结构 重点在于过程的实现 偏向下
C++偏向于面向对象的语言偏向上
大规模用户界面交接尽量用.NET 跟数据库对接也方便
9. #define const sizeof
#definde MIN(A,B) ( (A)<=(B)? (A) : (B) ) 仅仅是宏替换而已 跟typedef不一样 不包含类型检查
const只读 修饰指针 常量 函数 返回值
#definde 没有类型安全检查 const有类型安全检查的
const函数里面不能修改成员变量的 不过 如果在成员变量定义地方加入mutable 如 mutable int temp;
计算结构变量大小时设计到数据对齐问题 为了使CPU存取的速度更快一般把变量中的成员大小按照4或者8的倍数计算,
虽然浪费内存但是速度更快了 关于struct跟Class的字节对齐
sizeof(class) 求的是类的所占字节数 设计到字节对齐 static int temp; 静态变量放在静态数据存储区
sizeof 不考虑static类型变量 运算符 sizeof(int) int temp; sizeof temp;
char* s="012345";
sizeof(s)= 4; 指针 sizeof(*s)=1 第一个字符
数组当函数参数是必须传入数组首地址 QuickSort(int a[], int n) 或者 QuickSort(int* a, int n)
32位机上 sizeof(string)=4 64位机上sizeof(string) = 8 重点记忆下 string 跟 int 类似 !!!
string temp[]={"my","computer"}; sizeof(temp)=2个string类型
int a=8 ; sizeof(a=6); cout<<a; 输出仍然上8 由于sizeof( )不能编译成机器码因此 a=6没执行
10. 在C++下,空类和空结构体的大小是1(编译器相关),这是为什么呢?为什么不是零?
这是因为,C++标准中规定,“no object shall have the same address in memory as any other variable” ,
就是任何 不同的对象不能拥有相同的内存地址。 如果空类大小为零,若我们声明一个这个类的对象数组,
那么数组中的每个对象都拥有了相同的地址,这显然是违背标准的
11. inline函数 以内存空间换取执行时间 跟register寄存器变量类似只是一种对内存对建议 跟普通成员函数一样
关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。
定义在类声明之中的(.h) 成员函数将自动地成为内联函数。使用内联将导致内存消耗代价较高。
12. 指针跟引用
关于指针 就一点 指针是所指对象的地址, 指针变量是普通变量。
指针指向 简单变量,数组, 数组元素,结构体 函数 常量 this
相同点都是地址的意思 int a=10; int&b=a; b=20等价于a=20;
不同点 引用是别名必须赋予初值不可为零 不可以再改变 引用++是所指对象++ 指针是指指针++
指针是开辟一个变量来存放 对象地址而已,sizeof 也不一样
C语言中没有引用只有取地址符&
C++之父在设计时为了包容C 才把C中的指针也带入到了C++中;
C++中引用的产生 可以归纳为 在特定的地方用特定的东西 用指针是可以实现指针功能 但是 太繁琐 比如
引用的原因主要是为了支持operator overloading ,
ClassFoo operator+( const ClassFoo *, const ClassFoo * )使用的时候只能是 &a + &b,
ClassFoo operator+( const ClassFoo &, const ClassFoo & ) 使用的时候只能是 a + b,更加智能化
char* str()
{
char strr[]="hello"; return strr;
} 这个函数返回的是局部变量地址 函数调用后局部变量strr释放了返回结果不确定 不安全
char* str()
{
static charstrr[]="hello"; returnstrr; // staitc 静态数据存储区不随函数结束而分配内存结束
}
char* str()
{
char* strr = "hello"; returnstrr;//是分配一个全局数组,是全局变量 hello 保存在只读数据存储区
}
char a[]="hello";是分配一个局部数组在局部函数里的栈上分配的
char a[]="hello"; a[0]='t'; 这个对的
char *b = "hello";是分配一个全局数组,是全局变量 hello保存在只读数据存储区
char *b = "hello"; b[0]='t' ;不对!
数组指针int a[]={1,2,3,4,5}; int *ptr=(int*)(&a +1) printf("%d %d", *(a+1), *(ptr-1)) 结果为2 5
*(a+1)=a[1] ; a是数组名本身就是指针 &a是二级指针 指针的指针 &a+1 是直接指向未出现的第二行首了
ptr-1 指向 第一行尾
int b[2][5]={1,2,3,4,5,6,7,8,9,10}; int *p=(int*) (&a +1)=b[1];
迷途指针-> delete 以后的指针 野指针 delete指针 意思是释放我们申请的内存 但是 指针本身是存在的
需要=NULL;
malloc/free 是C/C++的标准库函数 普通类型int double 等可以 但是对于对象级别的不行
new/delete是运算符 编译器级别的 执行构造函数(动态内存分配初始化)析构函数(清理释放内存)。
句柄 handle跟 指针pointer
Windows 句柄是微软特有的,具有唯一性。 Windows是一个以虚拟内存为基础的system ,windows管理内存不用就释放,因此需 要用32uint 来标记资源 类似指针的指针 跟指针完全不同概念。
This指针
this指针本质上是一个函数参数, this指针只能在成员函数中用,全局函数跟static函数无this
T* const this;
普通成员函数都有隐式使用的this指针
int Box::Volume()
{ return height*width*length} =>{this->height * this->width * this->length}