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

类型是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的用途有限,仅用于特殊场合,而且也只是进行读操作,尽量不要进行写操作。读操作只会使读取结果无意义,而写操作则会破坏该变量的原始数据,甚至变量邻近的重要数据。

C++语言中的类型(一)的更多相关文章

  1. C语言中不同类型的循环(Different types of loops in C)

    C语言中有三种类型的循环:for,while,do-while. while循环先判断循环条件. while (condition) { //gets executed after condition ...

  2. C++语言中的类型(二)

    --分门别类是简化事物最有效的方式. C++语言的强大能力的体现在对程序员自定义数据类型的支持.C++语言主要的一个设计目标就是让程序员自定义的数据类型像内置类型一样好用. 一.自定义数据类型 数据类 ...

  3. php弱类型语言中的类型判断

    1.php一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较.PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0. 例如:123abc转换后 ...

  4. C语言中不同类型的数据转换规则

    不同类型数据间的混合运算与类型转换 1.自动类型转换 在C语言中,自动类型转换遵循以下规则: ①若参与运算量的类型不同,则先转换成同一类型,然后进行运算 ②转换按数据长度增加的方向进行,以保证精度不降 ...

  5. C#语言中的类型转换方法(unfinished)

    一.C#中的数据类型 1.数值类型 2.字符类型 3.字符串类型 4.布尔类型 5.枚举类型 6.Object类型 二.常见的类型转换 从转换方式的角度,类型转换分为隐式转换与显式转换两种. 其中,隐 ...

  6. 关于C语言中不同类型数据进行计算 有符号和无符号数进行计算

    float是8个有效位, 做个试验: 输出如下: 上面说明了什么: 1, 18/2.2 是除不尽的, 因为是define,所以没有给ratio变量赋值类型,但是从sizeof输出的结果是8,所以系统默 ...

  7. c语言中各个类型的sizeof长度

    #include <stdio.h> int main() {     printf("\nA Char is %lu bytes", sizeof( char )); ...

  8. Go 语言中的方法,接口和嵌入类型

    https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...

  9. 【转】C语言中不同的结构体类型的指针间的强制转换详解

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

随机推荐

  1. 4.ElasticSearch的基本api操作

    1. ElasticSearch的Index 1. 索引初始化 在创建索引之前 对索引进行初始化操作 指定shards数量和replicas数量 curl -XPUT 'http://192.168. ...

  2. PE格式第五讲,手工添加节表

    PE格式第五讲,手工添加节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 首先我们要用汇编编写一段汇编代码,用来生成 ...

  3. iOS10适配相关

    2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从Notificat ...

  4. ActivityManager与Proxy模式的运用

    Android学习——ActivityManager与Proxy模式的运用 一 Proxy模式 意图: 为其他对象提供一种代理以控制这个对象的访问. 适用性: l  远程代理( Remote Prox ...

  5. 在Git上如何强推代码规范

    引言 最近参加了“前端规范制定topic”小组,小组成员一起制定了html.css.js.es6.vue和react等规范,但规范制定好了怎么进行推广去强制执行呢,已知我们的项目都是用git做管理的, ...

  6. 【转】循环冗余校验(CRC)算法入门引导

    原文地址:循环冗余校验(CRC)算法入门引导 参考地址:https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks#Re ...

  7. Tirp(状压DP)

    Description 有一个N*N的迷宫,其中有一些宝藏,现在,小A要从入口(1,1)出发,到达出口(N,N),每次,小A只能从当前的格子走到上下左右四个格子,为了不空手而归,小A决定要拿到所以的宝 ...

  8. PHP入门,clone和__clone

      前 言 这篇文章主要介绍了PHP编程中的__clone()方法使用详解,__clone()方法相当于一个浅拷贝,是PHP入门学习中的基础知识,需要的朋友可以参考下. 1对象是引用数据类型,当使用= ...

  9. mysql 中翻页

    万变不离其中 select * from tableName where 条件 limit 当前页码*页面容量-1 , 页面容量

  10. yii2之依赖注入与依赖注入容器

    一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...