C++Primer2.3节介绍了两种复合类型:引用和指针

1.引用

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

1.初始化常量引用时允许用字面值或任意表达式作为初始值,只要该表达式的结果能通过类型转换成引用的类型即可。
2.可以将基类的引用绑定到派生类对象上。

举几个例子:
int &refVal4 = 10; // 错误:引用类型的初始值必须是一个对象
double dval = 3.14;
int &refVal5 = dval; // 错误:此处引用类型的初始值必须是int型对象
int i = 42;
const int &r1 = i; // 允许将const int&绑定到一个普通int对象
const int &r2 = 42; // 正确:r2是一个常量引用
const int &r3 = r1 * 2; // 正确:r3是一个常量引用
int &r4 = r * 2; // 错误:r4是一个普通的非常量引用


2.指针

指针也能实现对其他对象的间接访问。与引用不同的是。

  • 指针本身就是一个对象,允许对指针赋值和拷贝,在其生命周期内可以先后指向几个不同的对象。
  • 指针无须在定义时赋初值。
    获取对象的地址
    指针存放某个对象的地址,使用取地址符获取地址:
    int ival = 42;
    int *p = &ival;
    指针值
    指针的值(即地址)应属下列4种状态之一:
  1. 指向一个对象。
  2. 指向紧邻对象所占空间的下一个位置。
  3. 空指针,未指向任何对象。
  4. 无效指针。
    利用指针访问对象
    如果指针指向了一个对象(需要是有效指针),则可以使用解引用符*来访问该对象。可以对其进行赋值等操作。
    空指针
    空指针不指向任何对象,在试图使用一个指针前代码可以首先检查它是否为空。生成空指针的方法:
  • int *p1 = nullptr; // 等价于int *p1 = 0;

    c++11新标准,建议使用

  • int *p2 = 0; // 直接p2初始化为字面常量0
  • // 首先#include cstdlib
    int *p3 = NULL; // 等价于 int *p3 = 0;
    直接把值为0的int 变量赋给指针是错误的操作
    int zero = 0;
    pi = zero; // _error: cannot assign an int to a pointer_

C++Primer快速浏览笔记-复合类型的更多相关文章

  1. C++Primer快速浏览笔记-类型转换

    bool b = 42; // _b is true_ int i = b; // _i has value 1_ i = 3.14; // _i has value 3_ double pi = i ...

  2. C++ Primer Plus 第四章 复合类型 学习笔记

    第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...

  3. 《C++ Primer Plus》读书笔记之二—复合类型

    二.第四章 复合类型  1.C-风格字符串:C-风格字符串具有一种特殊的性质:以空字符结尾,空字符被写成\0,其ASC||编码为0,用来标记字符串的结尾.例如: char dog[5]={'b','e ...

  4. C++ primer plus读书笔记——第4章 复合类型

    第4章 复合类型 1. 如果将sizeof运算符用于数组名,得到的将是整个数组中的字节数. 2. 如果对数组的一部分进行初始化,则编译器把其他元素设置为0.因此,将数组中的所有元素初始化为0,只要显式 ...

  5. 学习C++.Primer.Plus 4 复合类型

    本章介绍的有复合类型有: 数组. 字符串. 结构. 共用体. 指针 数组: 声明数组时数组长度必须为常量(或const). 只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外 ...

  6. 再读《C++ Primer》——变量和基本类型

    刚上大学那时,几个室友一块买了本<C++ Primer>第4版,看了一遍后就没怎么碰了,偶尔拿出来翻翻,当作工具书使用.后来知道有第5版了,一直觉得内容差不多吧.直到最近,再读其中的一些内 ...

  7. c++学习总结--复合类型,const。

    复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复 ...

  8. Angular快速学习笔记(2) -- 架构

    0. angular 与angular js angular 1.0 google改名为Angular js 新版本的,2.0以上的,继续叫angular,但是除了名字还叫angular,已经是一个全 ...

  9. Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)

    本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...

随机推荐

  1. git branch使用

    (1) git配置global信息: git config --global user.name "Your Name" git config --global user.emai ...

  2. W3C标准

    W3C标准:World Wide Web Consortium 万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构.到目前为止,W3C已经发布了200多项影响深远的W ...

  3. iptables之链之间的跳转

    创建一个新的链     按照管理,用户自定义的链用小写来区分它们 iptables -N newchain 可以在这个链的尾部跳转到INPUT链 iptables -A newchain -j INP ...

  4. PHP中文字符串编码转换

    2016年2月26日 16:47:13 星期五 情景: PHP从csv导入数据时乱码 $name = mb_convert_encoding($name, 'UTF-8', 'ASCII,GBK,GB ...

  5. cxLookupComboBox 控件

    cxLookupComboBox cxLookupComboBox1.Properties.ListSource        //显示数据源     dtsTmnList cxLookupCombo ...

  6. java web 学习 --第六天(Java三级考试)

    第五天学习在这:http://www.cnblogs.com/tobecrazy/p/3458592.html session对象 当某个用户首次访问web应用系统时,jsp会自动创建出一个sessi ...

  7. MinGW平台 openjpeg-2.1.0 静态编译后未定义引用的解决方法

    undefined reference to __imp_opj_xxx keyword: ffmpeg,openjpeg,OPJ_EXPORTS,OPJ_STATIC,opj_version,__i ...

  8. DP:教授逻辑学问题

    http://www.zhihu.com/question/23999095#answer-12373156问题来自知乎 2015-08-17 问题描述: 一个教授逻辑学的教授,有三个学生,而且三个学 ...

  9. BestCoder22 1003.NPY and shot 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5144 题目意思:有个人抛物体,已知抛的速度和高度,问可以抛到的最远距离是多少.即水平距离. 做的时候是 ...

  10. 在JAVA中如何跳出当前的多重嵌套循环

    可以使用return,但使用return后,会跳出整个函数,多重循环后面的代码无法执行. public static void main(String[] args) { // TODO Auto-g ...