C++学习——C++复合类型
1.引用
引用是为某一个变量起了另一个名字,定义方式为type &rval = val;
引用类型必须与引用的变量类型完全一致,引用后,rval和val将会被视为一个变量,只不过有两种调用方式,改变rval的值,val的值会随之改变,改变val的值,对rval进行调用时值也发生了改变。将一个值绑定后,将无法绑定其他变量。引用并不是对象,这决定了在定义引用时,等号的右边不能为引用,即不能定义引用的引用。
尤为重要的是,引用必须要初始化,否则语句就是非法的。
当引用牵涉到const限定符的时候会变得非常有趣。const type &rval=val,这个表达式的右边现在可以赋值为字面值常量了,同时也可以被赋值以变量,但普通的引用类型是无法引用字面值常量的。同时它的类型不那么受拘束了,如在之前的定义中,
double d = 3.14;
int &ri = d;
这样的代码是不被编译器接受的,因为对一个整型引用来说,double 类型的d变量是不合法的,但是加入了const限定符之后
double d = 3.14;
const int &ri = d;
这样的代码就是合法的,并且ri的值为3。
发生这种情况的原因是,当ri引用时,期望得到的是一个整型常量,然而d是一个双精度浮点数,为了让ri绑定它,编译器在编译过程中引入了这样的过程
const int temp = d;
const int &ri = temp;
这样一来,d先由双精度浮点数转换为整型常量temp,然后让ri来绑定temp,就变得合法了。
2.指针
指针是公认C语言最精髓的部分,也被C++语言继承而来,与它的精髓所匹配的就是它的难度。指针与引用类似,同样是指向一个变量,但不同的是,指针指向变量后可以随意变更所指对象,也可以通过指针访问对象,但通过对象并不能对指针产生改变,同时指针自身也是一个对象,这就决定了定义指针时,等号右边是可以为指针的,即我们可以定义指针的指针。指针在定义时并不一定要赋初值,如果是在函数体内定义,不赋初值会产生一个不确定的量,为防止指针指向奇怪的地方因而导致程序崩溃,在定义指针时赋值或者让其指向空是很必要的手段。
指针定义形式如下: type *ptr = &val;
关于*和&符号在程序中的作用有必要予以说明:
*是解引用符,如p是指向对象a的一个指针,此时想要通过指针p访问a,则需要使用*p解除p的引用,即指向a。&是一个取地址符,对变量a,取a的地址用&来表示。同时它们又可以用来定义引用或指针,因此以下代码可以帮助理解:
int i = 42;
int &r = i; //&紧随类型名出现,因此是声明的一部分,r是一个引用
int *p; //*紧随类型名出现,因此是声明的一部分,p是一个指针
p = &i; //&出现在表达式中,是一个取地址符
*p = i; //*出现在表达式中,是一个解引用符
int &r2 = *p; //&是声明的一部分,*是一个解引用符
一个指针的值应为以下四种状态之一:
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置
3.空指针,即不指向任何对象
4.无效指针,即除以上三种情况的指针
空指针是指针比较重要的一个状态,空指针即指针当前不指向任何对象,在定义指针时,如果不清楚指针应当指向何处,可以将其指向空。将一个指针指向空有三种方法:
*ptr = nullptr;
*ptr = 0;//需要cstdlib库的支持
*ptr = NULL
这三种方法均可以将指针指向空,但同时又有所不同。*ptr = nullptr;是C++11新标准中引入的一种方法,nullptr是一个较为特殊的字面值,它可以被转换成任意其他指针类型;*ptr = 0;即将指针初始化为字面值0来得到空指针。NULL则是过去经常用的一种预处理变量(预处理变量不属于std命名空间,归预处理器官,因此在调用null时不需要加std::)现在的程序最好用nullptr来得到空指针。
C++primer中建议所有指针都必须进行初始化,否则容易引起程序崩溃。
由于指针赋值是一个及其让人脑热的操作,因此谨记一点:被赋值的即是等号左边的部分。
指针同样可以用作布尔表达式。
if(p)…即表示如果指针p指向空则返回false,不为空则返回true.
void*指针
void 指针可以存放任意类型的指针,它可以:和别的指针进行比较;作为函数输入或输出;赋值给另外一个void*指针。并不能对void*指针指向的对象进行操作,因为我们并不清楚它到底是什么类型的。
C++学习——C++复合类型的更多相关文章
- c++学习总结--复合类型,const。
复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复 ...
- c语言基础学习09_复合类型
=============================================================================涉及到的知识点有:一.结构体1.定义结构体st ...
- C++ Primer Plus 第四章 复合类型 学习笔记
第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...
- 学习C++.Primer.Plus 4 复合类型
本章介绍的有复合类型有: 数组. 字符串. 结构. 共用体. 指针 数组: 声明数组时数组长度必须为常量(或const). 只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外 ...
- oracle学习 十一 包+复合类型+自定义异常(持续更新)
在这里讲一下包的概念, 二话不说上个例子 包头: create or replace package pck_test is procedure proc_report_salary(name nva ...
- 第54讲:Scala中复合类型实战详解
今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...
- Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)
本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...
- Golang - 复合类型
目录 Golang - 复合类型 1. 指针 2. new()和make() 3. 数组 4. slice 5. Map 6. 结构体 7. 结构体参数 Golang - 复合类型 1. 指针 go语 ...
- 带你学够浪:Go语言基础系列 - 8分钟学复合类型
★ 文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) " 对于一般的语言使用者来说 ,20% ...
随机推荐
- 深入了解跟踪(trace)
深入了解跟踪(trace) 转自:https://www.cnblogs.com/zhijianliutang/p/4113911.html 前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们 ...
- Linux系统性能调优之性能分析
1.Linux性能分析的目的1)找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈):2)提供性能优化的方案(升级硬件?改进系统系统结构?):3)达到合理的硬件和软件配置:4)使系统资源使用达到最大的平衡.(一 ...
- matlab实现MSER(最大极值稳定区域)来进行文本定位
一.自然场景文本定位综述 场景图像中文本占据的范围一般都较小,图像中存在着大范围的非文本区域.因此,场景图像文本定位作为一个独立步骤越来越受到重视.这包括从最先的CD和杂志封面文本定位到智能交通系 ...
- mysql5.7新特性探究
一.MySql5.7增加的特性 1.MySql服务方面新特性 1) 初始化方式改变 MySql5.7之前版本初始化方式: scripts/mysql_install_db MySql5.7版本初始化方 ...
- Linux界面交互与目录结构
一.交互通道 Linux系统环境默认有六个命令交互通道和一个图形界面交互通道,默认进入的是图形界面通道. 命令交互模式切换:ctrl+alt+F1-F6 图形界面交互模式:ctrl+alt+F7 ...
- [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程
基于NVidia开源的nvidia/cuda image,构建适用于DeepLearning的基础image. 思路就是先把常用的东西都塞进去,再装某个框架就省事儿了. 为了体验重装系统的乐趣,所以采 ...
- XDU 1111
对于一排n个正方形,有f(n)种方案达成目标,若第n个块是白色,则有f(n-1)种方案,若第n个块是黑色,则第n-1个块必为白色,那么有f(n-2)+n-2种方案. 则f(n)=f(n-1)+f(n- ...
- ruby中的可调用对象--方法
上一篇讲了ruby中的可调用对象proc和lambda,他们都是块转换成的对象.ruby中的可调用对象还有方法.通过使用method方法,并且以方法名作为参数(字符串或者符号),就可以得到一个方法对象 ...
- hdu5716
地址: 题目: 带可选字符的多字符串匹配 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- JAVA BIO与NIO、AIO的区别
IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...