Ch2_2&3复合类型

复合类型

  • 引用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复合类型

时间: 2024-10-15 22:17:22

Ch2_2&3复合类型的相关文章

第四章 复合类型

第四章  复合类型 4.1  数组 4.1.1  数组简介 数组(array)是一种数据格式,能够存储多个同类型的值. 声明数组的通用格式如下: typeName arrayName[arraySize]; 表达式arraySize指定数组的元素数目,它只能是以下三种情况之一: 1)        整型常数(如10,枚举值也可以): 2)        const值 3)        常量表达式(如8 * sizeof(int)) 注意:使用数组要注意下标的正确.编译器不会检查使用的下标是否有

C++ 语法--唯一的难点const和复合类型

总结在底下. 1.const和引用 可以把引用绑定在常量上,称之为,对常量的引用.不能对那个引用赋值. 如: const int ci = 1024; const int &ri = ci; 解读:ri是对ci的引用.ri的const意思是视ci为变量. 对于常量,只能使用“对常量的引用”这个引用方式 int &ri = ci;是错误的,因为ci不能赋值,但是可能会对ri赋值从而影响const限定. 所以,他们(制定标准的人)创造了 对常量的引用 的 引用方式. 下面高能!!! 上面说:

C++Primer快速浏览笔记-复合类型

C++Primer2.3节介绍了两种复合类型:引用和指针 1.引用 引用并非对象,它只是为一个已经存在的对象所起的别名. 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象,因此引用必须初始化. 定义引用时,程序把引用和它的初始值绑定到一起,而不是将初始值拷贝给引用. 引用本身不是一个对象,所以不能定义引用的引用 引用只能绑定在对象上,而不能与字面值或者某个表达式的结果绑定在一起. 引用的类型必须和与之绑定的对象的类型严格匹配.但是有两种例外情况: 1.初始化常量引用

hive原生和复合类型的数据加载和使用

原生类型 原生类型包括TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY (Hive 0.8.0以上才可用),TIMESTAMP (Hive 0.8.0以上才可用),这些数据加载很容易,只要设置好列分隔符,按照列分隔符输出到文件就可以了. 假设有这么一张用户登陆表 CREATE TABLE login ( uid BIGINT, ip STRING ) ROW FORMAT DELIMITED FIELDS TERMINA

C++ Primer Plus(四)——复合类型

只能在定义数组时才能初始化,不能将一个数组赋值给另一个数组,但可以使用下标分别赋值给数组元素,但可以将一个string对象赋值给另一个string对象 如果只对数组的一部分初始化,其他元素自动设置为0 C++11可在初始化的大括号里不包含任何东西,这将把所有元素设置为0 C++11在数组列表初始化时,禁止缩窄转换 C-风格字符串以\0结尾,不是\0结尾的字符数组不是字符串 任何两个由空白(空格,制表符,换行符)分隔的字符串常量都将自己拼成一个 sizeof运算符指出整个数组的长度,而strlen

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

C++ Primer Plus 复合类型

复合类型是指基于基本整型和浮点类类型而创建的数据格式. 1. 数组 1.1 声明数组时,必须指定元素数目,且元素数目必须是编译时已知的,所以变量(运行时设置的)不可以用来指定数目: 1.2 如果只对数组的一部分进行初始化,则编译器将其他元素设置为0; 所以初始化整个数组为0可以--int array[10] = {0}; 注: C++ 11支持去掉代码中的等号以及0,且不支持缩窄转换; 2. 字符串(C-风格字符串) 2.1 C++处理字符串有两种方式--C-风格字符串 & string类库;

《c++primer笔记》复合类型--引用

复合类型:基于其他类型定义的语言 这里介绍两种 引用 指针 声明语句:一个基本数据类型,一个声明符列表组成 引用:为对象起另外一个名字 引用类型:引用另外一种类型 int ival = 1024; int &refVal = ival;        //refVal指向ival(是ival的另一个名字) int &refVal2;              //报错,引用必须被初始化 一般初始化变量:初始值会被拷贝到新建的对象中 定义引用:把引用和他的初始值绑定在一起,而不是拷贝给引用.

Go语言学习笔记(4)复合类型

  Go语言的复合类型,包括数组.切片和映射等. 值.指针和引用类型 通常情况下Go语言中的变量持有相应的值.也就是说,我们可以将一个变量想象成它所持有的值来使用.其中有些例外,通道.函数.方法.映射.切片是 引用变量,它们持有的都是引用,也即保存指针的变量.值在传递给函数或者方法的时候会被复制一次,对于布尔类型和数值类型来说这非常廉价,但是对于大型变 量代价却非常大.而且复制传参的方式,修改值只是修改了副本,这能保证原始变量不被修改,但也一定程度上增加了修改原始值的麻烦.幸好在Go语言中有指