码迷,mamicode.com
首页 > 其他好文 > 详细

Ch2_2&3复合类型

时间:2016-04-09 15:08:55      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

复合类型

  • 引用reference

格式:基本数据类型+声明符(&d)= 对象;其中d是声明的变量名;

eg. int ival = 1024;

int &refVal = ival;

  • 引用即是一个存在的对象/变量的另外的一个名字;
  • 引用不是一个对象,对引用的操作即是对其绑定对象的操作;
  • 引用必须与初始值bind在一起,并且无法重新bind到另外一个对象;
  • 指针pointer

与引用的不同之处:

  • 指针本身是一个对象,允许对指针复制和拷贝,可以先后指向不同的对象;
  • 指针无须在定义时赋初值。
  • 格式:声明符*d,其中d是声明的变量名
  • 空指针:nullptr/0/NULL
  • Void*指针:

    不能直接操作void*指针所指的对象;

    作用:与别的指针比较、作为函数的输出或输入?

  • 指向指针的引用:

    eg. int *&r = p; //从右向左读r的定义,离变量名最近的符号为&,所以r为引用

    // 符号*说明r引用的是一个指针

  • Const 限定符
    • Const解释:
      • const修饰的对象不能改变其值,且必须初始化;
      • 默认状态下,const对象仅在文件内有效;共享则加extern修饰符
      • const int bufSize = 512; 编译器将bufSize用512替换;
    • 对const的引用/常量引用
      • 引用——通过引用的操作间接对绑定对象的操作,即是对象的别名
      • const修饰符——不能改变被修饰引用的值;

两者共同作用:不能改变被绑定对象的值;

一般的用例:const int ci = 1024; const int &r1 = ci;//普通的用法

特殊的用例:const int &ri = (非常量的对象、字面值、表达式);

//此时,ri 绑定了一个临时量对象

编译器将其等价于

????????????????Const int temp = (非常量的对象、字面值、表达式);

????????????????Const &ri = temp;

  • 常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。
  • 指针与const
    • const 的位置很重要!!!!
    • Const的位置决定—— 常量指针,指向常量的指针;指向常量的常量指针;
    • 常量指针: double pi = 3.14159;

      double *const ptr = π//ptr是一个常量指针

      ptr = &pi1; //错误,const限制了指针的指向操作;

      *ptr = 3.1;????????//正确,ptr指向对象的操作正常

      ?

    • 指向常量的指针:const double *ptr = π //ptr是一个指向常量的指针

      *ptr = 3.1; //错误,const限制了指针指向对象的操作

      Ptr = &pi1; //正确,ptr可以指向其他对象

    • 指向向量的常量指针: const double *const ptr = π

      *ptr = 3.1; //错误

      Ptr = &pi1; //错误

      ?

  • 顶层const与底层const
    • 一个const是底层还是顶层?

//low-level and top level

????int i = 0;

????int *const p1 = &i; //顶层const

????const int ci = 42;???????? //顶层const

????const int *p2 = &ci;???? //底层const

????const int *const p3 = p2; //左边一个const为顶层const,右边一个为底层cosnt

???? const int &r = ci;???????? //凡是用于声明引用的const都是底层const

  • 总结:
    • const修饰的是基本类型时,此时const的是顶层的;
    • const修饰的是类似于指针的符合类型时,此时判断const顶层或底层取决于const 的位置;
    • 引用(&),是底层const的;

?

  • 当Constexpr 和常量表达式
    • 什么是常量表达式?
  1. 值不会改变
  2. 在编译过程就能够得到计算结果的表达式;
  3. 取决于数据类型(有无const限制)与初始值(是个常量);
  • 引入constexpr变量

判断初始值是不是常量表达式很麻烦,,所以引入constexpr 类型,让编译器来验证变量值石头是一个常量表达式。

  • 字面值类型

    什么的类型能可以被定义为constexpr?——字面值类型(指针、引用、算术类型)

    定义后的constexpr初始值

    • 指针和constexpr
      • 定义constexpr成的指针初值只能是:nullpt、0、存储在某个固定地址中的对象。函数体内定义的变量一般来都并非存放在固定地址。
      • constexpr 将指针置为顶层的const;即一个常量指针;

Ch2_2&3复合类型

标签:

原文地址:http://www.cnblogs.com/linj2n/p/5371529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!