C++语言中的类型(一)

——分门别类是简化事物最有效的方式。

类型是C++语言的基础,对象类型决定了能对该对象进行的操作。

一、基本内置数据类型

C++预先定义的基本内置数据类型是构造世界万物的原子,数据类型告诉我们数据的意义以及我们能在数据上执行的操作。

1、 数据的分类

C++把所有的数据抽象为以下几种基本类型:

1) 数字(包括整型和浮点型)

2) 符号(字符型)

3) 逻辑(布尔型)

我们可以利用这些基本数据类型构造出所有我们需要的更复杂的数据类型。

2、 数据的操作

      C++以运算符的简洁形式提供了基本内置类型最常用的操作。一个运算符就是一个功能函数,因此学习运算符需要了解三点:输入形参、返回类型和功能。运算符的简洁形式大大简化了表达式的书写,但形式的简化不该损失必要的信息。为了正确理解表达式的含义,我们需要了解运算符形式外的规则:优先级、结合律和运算对象求值顺序。

二、参数传递方式的类型抽象

1、参数的传递有两种方式

1) 拷贝副本

2) 使用原本

      C++语言是特别注重运行效率的,因而总是使用拷贝副本的方式是不够的。全局变量的使用虽然可以不用拷贝副本,但它带来的副作用太大(变量名字冲突、程序间出现耦合以及数据的安全风险)。因而有了指针类型和引用类型。指针和引用使我们可以直接使用数据的原本,而又可以避免使用全局变量时的弊端。

2、指针类型和引用类型的比较

指针类型是通过保存变量在内存中的地址来实现对变量的间接访问,因而有两个弊端:

1) 效率低

需要为指针额外开辟内存空间来保存地址。

2) 安全风险

变量是类型的实际载体,而在内存空间上并没有类型的概念,因而无效的地址,会带来安全风险。

引用只是变量的别名,并不是一个对象,因而很好地规避了指针以上的两个缺点。所以,现代C++编程,建议使用引用类型,而尽量避免使用指针类型。

三、读写属性的类型抽象

对于一个基本类型(或者把其看作基本类型)的变量,其读写状态分为三种:

1) 不可读(即不可见)

2) 仅可读

3) 可读写

     由于对于一个基本类型的变量,不可读是完全没有意义的(不会使用到,则存在无意义)。因而只剩下了两种状态:仅可读和可读写。C++语言用常量类型(const)表示变量是仅可读的,而用非常量类型(默认类型)表示变量是可读写的。

四、类型转换

分门别类是简化事物最有效的方式,但事物间往往是存在联系的,因而C++语言允许类型转换。

      类型转换打破了类型间的壁垒,构筑了类型间交流的桥梁,但同时也带来了安全风险。为了保证(希望而已,非绝对保证)类型间的转换具有一定的意义(类型之间真的存在联系)和转换过程的安全可靠,C++语言把变量类型的转换明确分为三类:

1) 变量值(内容)的类型转换(static_cast)

通过创建一个临时对象来得到变量值在另一种类型中的对应。因而相对安全一些,所以限制比较松,但这里也可以看出,类型转换可能会带来一定的运行效率损失。

2) 变量读写性质的类型转换(const_cast)

      对变量值的读写性质转换是没有意义的,因而const_cast只能改变运算对象的底层const(指向常量对象的引用或者指针)。变量读写性质的改变涉及到数据的安全性,因而const_cast通常只用在一种情况下:函数的声明参数在形式上需要一个非常量对象,而函数实际上并不改变实参的内容。

3) 变量内存空间的类型转换(reinterpret_cast)

      一国不可二主,一山难容二虎。同样的道理,不应该对一个实体施加同一级别的两种规则,否则必然造成混乱,甚而带来危险。reinterpret_cast的用途有限,仅用于特殊场合,而且也只是进行读操作,尽量不要进行写操作。读操作只会使读取结果无意义,而写操作则会破坏该变量的原始数据,甚至变量邻近的重要数据。

posted on 2017-03-19 22:08  水木颛顼  阅读(836)  评论(0编辑  收藏  举报

导航