自学小笔记

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}

关注公众号 海量干货等你
原文地址:https://www.cnblogs.com/sowhat1412/p/12734483.html