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

  • 相关阅读:
    POJ 1990 MooFest
    python的unittest測试框架的扩展浅谈
    星云測试- Android应用深度体检专业平台
    HDOJ 1507 Uncle Tom's Inherited Land*
    产品设计
    Linux网络编程--wireshark分析TCP包头的格式
    java读取中文分词工具(一)
    为datatable添加自增列
    Oracle 自己主动内存管理 SGA、PGA 具体解释
    TCP/IP基础
  • 原文地址:https://www.cnblogs.com/ggYYa/p/5703729.html
Copyright © 2011-2022 走看看