zoukankan      html  css  js  c++  java
  • C++ Primer 第二章 引用 指针 const限定符

    1.引用:

      为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名)。

      PS:1.通过图片中编译所提示的报错信息也可知,引用必须被初始化;

        2.引用并非对象,相反的,它只是为一个已经存在的对象所起的另一个名字而已;

    2.指针:

      与引用类似,指针也实现了对其他对象的间接访问,不过,指针本身就是一个对象,允许对指针赋值与拷贝,而且在其生命周期内可以先后指向几个不同的对象(引用只能指向一个初始化的)。

      指针无须再定义时赋初值,与其他内置类型一样,在块作用域内定义的指针如果没有被初始化,它也将拥有一个不确定的值。

    PS:指针存放某个对象的地址,指针的值就是地址;

    1     int *p1,*p2;//p1和p2都是指向int型对象的指针;
    2     double p3,*p4;//p4是指向double型对象的指针,p3是double型对象;
    3     int i = 12;
    4     int *p1 = &i;//p1存放变量i的地址,或p1指向i;
    5     *p1 = 2;//正确,由*得到指针所指的对象,即可经由p为变量i赋值;
    6     p2 = &i;//正确,同是int*类型 ;
    7     *p2 = &i;//错误,类型之间不能转换,&i是int*类型,*p2是int类型;
    8     p4 = 0;//正确,因为0没有数据类型;

    3.const限定符:

      const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

    其主要作用有:

      (1)可以定义const常量,具有不可变性。 
      例如:const int Max=100; Max++会产生错误; 
      (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
      例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改; 
      (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
      如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可! 
      (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 
      例如: void f(const int i) { i=10;//error! } 
      (5) 可以节省空间,避免不必要的内存分配。 例如: 
      #define PI 3.14159 //常量宏 
      const double Pi=3.14159; //此时并未将Pi放入RAM中 ...... 
      double i=Pi; //此时为Pi分配内存,以后不再分配! 
      double I=PI; //编译期间进行宏替换,分配内存 
      double j=Pi; //没有内存分配 
      double J=PI; //再进行宏替换,又一次分配内存! 
      const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。 
      (6) 提高了效率。 
      编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

     PS:const限定的对象规则(左数右指:const和*的位置),也可叫顶层const和底层const。

      下面分别用const限定不可变的内容是什么?
      1)const在前面
      const int nValue; //nValue是const
      const char *pContent; //*pContent是const, pContent可变
      const char* const pContent; //pContent和*pContent都是const

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/ggYYa/p/5703729.html
Copyright © 2011-2022 走看看