C++ 第二课

来源:互联网 发布:骑士vs勇士第五场数据 编辑:程序博客网 时间:2024/06/05 00:45

各位亲 有时间可以去看看我的  “金骏家居淘宝店” http://jinjun1688.taobao.com/shop/view_shop.htm?tracelog=twddp 买时说明在我的博客看到有优惠哦 还有意外礼品赠送  真正的程序员淘宝店


一、C++内存分配

  C语言中通过malloc/calloc/realloc/ free 函数实现内存的分配和释放,C++除了对C的兼容以外,提供了new/delete运算符来实现内存的分配和释放。

    如: int*p=(int* )malloc (sizeof(int));

              *p=100;

              free(p);

             p=(int*)malloc(10*sizeof(int))

              for(int i=0;i<10;i++)

                  p[j]=i;

            free(p);

----------------------------------------------------------------------------------

           int*p=new int;

           *p=100;

           delete p;

           p=new int[10];

           for(int i=0;i<10;i++)

              p[i]=i;

           delete[] p;

           p=new int(100);

           cout<<*p<<endl;    //100

           delete p;

二、引用

   1.引用即别名

      int a=10;

     int& b=a;

     cout<<b<<endl;   //10

    b++;

    cout<<a<<endl;  //11;

      int&  b;   //error !

      int& c=b; // int& c=a;

----------------------------------------

     2.引用必须被初始化为与有效内存相关联

      int& r=*new int;

    delete &r;

    3 引用型参数

    1)通过引用型参数可以在函数中对实参变量进行修改

     2)通过引用型参数可以避免参数传递过程中的数据拷贝

     3)通过将参数定义为常引用防止在函数对参数的意外修改,同时还可以接受常量型实参

     4)传递引用型参数实际上就是传递地址,引用必须与有效内存相关联,引用的本质就是指针

      4引用型返回值

       永远不要反悔局部变量的引用(因为局部变量在作用域符号{}后就被销毁了,数据存在不确定性),返回全局/静态/成员变量的引用是安全的

       5.引用和指针

       1)指针可以不初始化,其目标可在指针被初始化后随意改变,引用必须初始化,且一旦确定就不能引用其他目标。

        int a, b;

       int *p=&a;

       p=&b;

       int& r=a;

       r=b;//把b值赋给a

       2)可以定义指向指针的指针,但不能定义指向引用的指针

              int a;

             int* p=&a;

             int **pp=&p;//ok

            int & r=a;

            int &* pr=&r;//error!

       3)可以定义引用指针的引用,不能定义引用引用的引用

            int a;

             int* p=&a;

             int*& rp=p;   //ok

             int& r=a;

            int&& pt=r;  //error!

         4)可以定义指针数组,但不能定义引用数组,可以定义数组引用

         int  a,b,c;

         int* parr[]={&a,&a,&c};   //ok

          int& parr[]={a,b,c};    //error

------------------------------------------------------

          int arr[]={1,2,3};

        int (&rarr)[3]=arr;

         int(*parr)[3]=&arr;

三、类型转换运算符

      char c=‘a’;

      int n=int(c);

    1.静态类型转换

        目标类型 变量名=static_cast<目标类型>(源类型变量名);

  如:int n=static_cast<int>(c);

     编译器做静态类型检查:在源类型和目标类型之间只要有一个方向上能做隐式转换,那么在两个方向上都能做静态转换。

      2.动态类型转换

    目标类型 变量名=dynamic_cast<目标类型>(源类型变量名);

      主要用于具有多态特性的父子类指针/引用之间的转换。

    3.常量类型转换

     目标类型 变量名=const_cast<目标类型>(源类型变量名);

   用于去除指针/引用上的常属性。

    const int* p1;

   int* p2=const_cast<int*>(p1);

   double* p3=const_cast<double*>(*p1);//error

   注意:试图通过const_cast修改一个常量的值,其后果是不确定的。

    4.重解释类型转换

     目标类型 变量名=reinterpret_cast<目标类型>(源类型变量名);

    在任意类型的指针或引用之间转换,甚至可以再指针和整数之间转换。

-----------------------------------------------------------------------------------------------------------------------------------

 

    建议:1)尽量少用宏,取而代之的是 const和enum以及inline

                         如:   #define PAI 3.14;

                                   const double PAI=3.14;

                                     #define square(x)   ((x)*(x))

                                     inline double square (int x) {...}

                2)变量随用随声明

                3)不要用malloc用new

                4)避免使用void* 、指针算数 、联合和强制类型转换

                5)尽量少用C风格的字符串(char* 和char 数组),代之以 string对象

                6)建立起面向对象的思想。

 

 

 

 

 

 

 

 

 

 

原创粉丝点击