zoukankan      html  css  js  c++  java
  • C++引用、类型转换、类和对象(day03)

    十 C++的引用(Reference)
    1 
    2 
    3 引用型函数参数
    1)将引用用于函数的参数,可以修改实参变量的值,同时也能减小函数调用的开销。
    2)引用参数有可能意外修饰实参的值,如果不希望修改实参变量本身,可以将其定义为常引用,提高传参效率的同时还可以接收常量型的实参。 
    
    4 引用型函数返回值
    1)可以将函数返回类型声明为引用,避免函数返回值所带来的开销。
    2)一个函数返回类型被声明为引用,那么该函数返回值可以是一个左值。
    3)为了避免在函数外部修改引用的目标,可以为该引用附加常属性。
    eg:
      int& foo(void){
         static int a = 100;
         return a;
      }
      int main(void)
      {
            foo() = 200;//ok
      }
    注:不要返回局部变量的引用,因为所引用的目标内存会在函数返回以后被释放,危险!
    但是可以返回成员变量、静态变量、全局变量的引用
    
    //笔试题:引用和指针的区别...
    5 引用和指针
    1)从C语言角度,引用的本质就是指针,但是在C++中推荐使用引用而不是指针。
    eg:
       double d = 3.14;
       double& rd = d;
       double* const pd = &d;
       rd <=等价=>*pd
    2)指针定义可以不做初始化,其目标可以修改(指针常量除外),而引用必须做初始化,而且一旦初始化所引用的目标能再改变。
    eg:
      int a=3,b=5;
      int* p;//ok,可以不初始化
      //int& r;//error
      p = &a;
      p = &b;
      int& r = a;
      r = b;//不是修改引用的目标,而是对r(a)进行赋值
      
    //后面了解
    3)可以定义指针的指针(二级指针),但是不能定义引用的指针
    eg:
      int a = 100;
      int* p = &a;
      int** pp = &p;
      
      int& r = a;
      int& * pr = &r;//error
      int* pr = &r;//ok,是一个普通的指针
    4)可以定义指针的引用,但是不能定义引用的引用  
    eg:
      int a = 100;
      int* p = &a;
      int* & rp = p;//ok,指针的引用
      -----------
      int& r = a;
      int&& rr = r;//error,在C++11中称为右值引用
      int& r2 = r;//ok,不能称为引用的引用,只是一个普通的引用,相当于给a再起一个别名。
      
    5)可以指针数组,但是不能引用数组
    eg:
      int a=1,b=2,c=3;
      int* parr[3] = {&a,&b,&c};//指针数组
      int& rarr[3] = {a,b,c};//error
    6)可以定义数组引用
    eg:
      int arr[3] = {1,2,3};
      //rarr称为数组引用,给数组起一个别名
      int (&rarr)[3] = arr;//ok
      arr[0] <-等价-> rarr[0]
    7)和函数指针一样,可以定义函数引用,语法和函数指针一致。
    eg:
      void func(int a,int b){...}
      int main(void){
           //定义和使用函数指针
           void (*pfunc)(int,int) = func;
           pfunc(10,20);
           //定义和使用函数引用
           void (&rfunc)(int,int) = func;
           rfunc(10,20);
      }
    ======================================
    十一 类型转换
    1 隐式类型转换
    eg:
      char c = 'A';
      int n = c;//隐式类型转换
      -----------
      void foo(int n){..}
      foo(c);//隐式类型转换
      -----------
      int foo(void){
            char c = 'A';
            return c;//隐式类型转换
      }
    2 强制类型转换
    eg:
      char c = 'A';
      int n = (int)c;//C风格的强制转换
      int n = int(c);//C++风格的强制转换
    
    3 C++增加了四种操作符形式的显式类型转换
    1)静态类型转换
    语法:
       目标类型变量 = 
               static_cast<目标类型>(源类型变量);
    适用场景:
       用于将void*转换为其它类型指针。
    eg:
        int a = 100;
        void* pv = &a;//ok
        int* pi = pv; //error
        int* pi = static_cast<int*>(pv);//ok
       
    2)动态类型转换(后面讲)
    语法:
       目标类型变量 = 
               dynamic_cast<目标类型>(源类型变量);
    3)常类型转换
    语法:
       目标类型变量 = 
               const_cast<目标类型>(源类型变量);
    适用场景:用于去除一个指针或引用的常属性
    eg:
       int a = 100;
       const int* pa = &a;
       *pa = 200;//error
       int* pa2 = const_cast<int*>(pa);
       *pa2 = 200;//ok
       -------------------
       const int& r = a;
       r = 300;//error
       int& r2 = const_cast<int&>(r);
       r2 = 300;//ok
       
    4)重解释类型转换 
    语法:
       目标类型变量 = 
            reinterpret_cast<目标类型>(源类型变量); 
    适用场景:
       -->任意类型的指针或引用之间的转换
       -->在指针和整型数之间的转换
       eg:
         int addr = 0x12345678;
         int* p = 
             reinterpret_cast<int*>(0x12345678);
         *p = 100;
    ======================
    小结:
    1 慎用宏,用const、enum、inline替换
    #define PAI 3.14 --》const double PAI = 3.14 
    
    #define STATE_SLEEP 0
    #define STATE_RUN    1
    #define STATE_STOP  2
    --》enum STATE{SLEEP,RUN,STOP};
    
    #define max(a,b) ((a)>(b)?(a):(b))
    --> inline int max(int a,int b){
            return a > b ? a : b;
        }
    2 变量随用随声明同时初始化
    
    3 尽量使用new/delete分配,取代malloc/free
    
    4 少用void*、指针计算、联合体、强制转换
    
    5 尽量使用string表示字符串,少用C中的char*表示的字符串
    
    ====================================
    十二 类和对象//了解
    1 什么是对象?
      万物皆对象,任何一种事物都可以看做是对象。
     
    2 如何描述对象?
      通过对象的属性(名词、数量词、形容词)和行为(动词)描述和表达对象。
     
    3 面向对象的程序设计
      对自然世界中对象观察引入到编程实践的一种理念和方法。这种方法称为"数据抽象",即在描述对象时把细节的东西剥离出去,只考虑一般性的,有规律性的和统一性的东西。
     
    4 什么是类?
      类是将多个对象的共性提取出来定义的一种新的数据类型,是对 对象的属性和行为的抽象描述。
     
  • 相关阅读:
    5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
    5.15 省选模拟赛 容斥 生成函数 dp
    5.15 省选模拟赛 T1 点分治 FFT
    5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
    luogu P4929 【模板】舞蹈链 DLX
    CF 878E Numbers on the blackboard 并查集 离线 贪心
    5.10 省选模拟赛 拍卖 博弈 dp
    5.12 省选模拟赛 T2 贪心 dp 搜索 差分
    5.10 省选模拟赛 tree 树形dp 逆元
    luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
  • 原文地址:https://www.cnblogs.com/Kernel001/p/7729436.html
Copyright © 2011-2022 走看看