• 自学小笔记


    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}

    关注公众号 海量干货等你
  • 相关阅读:
    python之集合(set)
    python之字典
    python之列表
    随笔
    JS实现颜色值格式转换 rgb和十六进制的转换
    20211025一周的计划
    密码肯定没错,但是你死活登录不了,登录页面检查密码格式不对,无法执行登录的一种解决方法
    安卓mbn文件丢失,无法搜索移动信号,工程模式mbn乱改,不用QPST烧录怎样恢复?超简单!
    安装Linux Deploy和Termux之后,再安装ftp服务软件都是多余的!
    “500 oops socket” Debian 9 running via Linux Deploy上成功部署vsftpd的解决方案(201901原创)【成功完美简单极致】
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734483.html
Copyright © 2020-2023  润新知