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*指针指向的对象进行操作,因为我们并不清楚它到底是什么类型的。

原文地址:https://www.cnblogs.com/kangyun/p/4369548.html