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 什么是类?
      类是将多个对象的共性提取出来定义的一种新的数据类型,是对 对象的属性和行为的抽象描述。
     
  • 相关阅读:
    Oracle查询中将结果列按分组用逗号隔开,拼接成一行(listagg函数)
    Oracle SQL获取每个分组中日期最大的一条数据
    oracle字段根据字符串拆分,用subStr()和inStr()进行拆分
    javascript求最大公约数
    javascript单链表
    防input required属性的提示框
    css3绘制三色字
    js和php时间戳的问题
    ajax使用的一些错误
    浏览器js文件未及时更新问题
  • 原文地址:https://www.cnblogs.com/Kernel001/p/7729436.html
Copyright © 2011-2022 走看看