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的用途有限,仅用于特殊场合,而且也只是进行读操作,尽量不要进行写操作。读操作只会使读取结果无意义,而写操作则会破坏该变量的原始数据,甚至变量邻近的重要数据。
C++语言中的类型(一)的更多相关文章
- C语言中不同类型的循环(Different types of loops in C)
C语言中有三种类型的循环:for,while,do-while. while循环先判断循环条件. while (condition) { //gets executed after condition ...
- C++语言中的类型(二)
--分门别类是简化事物最有效的方式. C++语言的强大能力的体现在对程序员自定义数据类型的支持.C++语言主要的一个设计目标就是让程序员自定义的数据类型像内置类型一样好用. 一.自定义数据类型 数据类 ...
- php弱类型语言中的类型判断
1.php一个数字和一个字符串进行比较或者进行运算时,PHP会把字符串转换成数字再进行比较.PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0. 例如:123abc转换后 ...
- C语言中不同类型的数据转换规则
不同类型数据间的混合运算与类型转换 1.自动类型转换 在C语言中,自动类型转换遵循以下规则: ①若参与运算量的类型不同,则先转换成同一类型,然后进行运算 ②转换按数据长度增加的方向进行,以保证精度不降 ...
- C#语言中的类型转换方法(unfinished)
一.C#中的数据类型 1.数值类型 2.字符类型 3.字符串类型 4.布尔类型 5.枚举类型 6.Object类型 二.常见的类型转换 从转换方式的角度,类型转换分为隐式转换与显式转换两种. 其中,隐 ...
- 关于C语言中不同类型数据进行计算 有符号和无符号数进行计算
float是8个有效位, 做个试验: 输出如下: 上面说明了什么: 1, 18/2.2 是除不尽的, 因为是define,所以没有给ratio变量赋值类型,但是从sizeof输出的结果是8,所以系统默 ...
- c语言中各个类型的sizeof长度
#include <stdio.h> int main() { printf("\nA Char is %lu bytes", sizeof( char )); ...
- Go 语言中的方法,接口和嵌入类型
https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...
- 【转】C语言中不同的结构体类型的指针间的强制转换详解
C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...
随机推荐
- 基于HTML5和WebGL的3D网络拓扑结构图
现在,3D模型已经用于各种不同的领域.在医疗行业使用它们制作器官的精确模型:电影行业将它们用于活动的人物.物体以及现实电影:视频游戏产业将它们作为计算机与视频游戏中的资源:在科学领域将它们作为化合物的 ...
- css笔记-文本样式
聊聊text-decoration.text-indent.text-transform.letter-spacing.word-spacing.vertical-align.下面是一些常用设置文本样 ...
- 机器学习技法:01 Linear Support Vector Machine
Roadmap Course Introduction Large-Margin Separating Hyperplane Standard Large-Margin Problem Support ...
- 张高兴的 Xamarin.Android 学习笔记:(一)环境配置
最近在自学 Xamarin 和 Android ,同时发现国内在做 Xamarin 的不多.我在自学中间遇到了很多问题,而且百度到的很多教程也有些过时,现在打算写点东西稍微总结下,顺便帮后人指指路了. ...
- JavaScript观察者模式
观察者模式观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得 ...
- Tomcat针对网站打开速度慢进行局部优化方案
首先打开tomcat下的conf文件夹里面的server.xml找到Tomcat端口号一栏 <Connector port="8081" protocol="HTT ...
- Spark 基本概念
Application:用户编写的 Spark 应用程序,包含驱动程序(Driver),和分布在集群中多个节点上运行的 Executor 代码,在执行过程中由一个或多个作业组成 Driver(驱动程序 ...
- 如何从零绘制k线图 -- 原生js canvas图表绘制
样式如下图 源码地址: https://github.com/sutianbinde/charts 编写这个需要具备canvas基础,如果没有canvas基础可以学习我前面的cnavas基础博客. 具 ...
- 关于 Swift 4 中内存安全访问
前言 本文主要翻译今年 The Swift Programming Language (Swift 4) 中新出的章节 -<Memory Safety>.在 Swift 4 中,内存安全访 ...
- 谈一谈原生JS中的【面向对象思想】
[重点提前说:面向对象的思想很重要!] 最近开始接触学习后台的PHP语言,在接触到PHP中的面向对象相关思想之后,突然想到之前曾接触的JS中的面向对象思想,无奈记性太差, ...