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是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...
随机推荐
- 【学习】滚动延迟加载插件scrollLoading用法
今天遇到一个很好用的滚动延迟加载的插件,作者是我的偶象大神张鑫旭,其博客为http://www.zhangxinxu.com/. 以前也写过这种效果,用的是lazyload,不过只能实现图片的加载.而 ...
- C#设计模式之八桥接模式(Bridge)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的.因为桥在我们现实 ...
- python 字典详解
1.字典的定义 字典类似于列表,但相对于列表来说字典更加通用,列表的下标必须必须为整数,而字典下标则可以为任意字符串/数字等,不可以是可变数据类型(列表,数组,元组) 字典包含下标(keys)集合和值 ...
- 在centos7上实现LAMP的全过程及实现wordpress
原理 http使用方法一编译安装,php独立服务fpm实现. 软件版本 在本次实验中,我们需要用到的软件版本如下: apr-1.6.2 apr-util-1.6.0 httpd-2.4.28 mari ...
- session失效问题
具体设置很简单,方法有三种: ()在主页面或者公共页面中加入:session.setMaxInactiveInterval();参数600单位是秒,即在没有10分钟活动后,session将失效. 这里 ...
- Myeclipse常见快捷键及配置
0. 快捷键 ================================================================================ 编辑: Ctrl+Shi ...
- 对于Swift的Enum,文档上没有说的
今天无意发现一个东西, 但是在文档上看了很多遍都没找到, 但是亲测是可行的, 那到底是什么呢? 以前我们定义枚举 会这样: enum Hello { case Item( String, Int) c ...
- Windows环境下多线程编程原理与应用读书笔记(3)————Windows环境中的多线程实现(3)
纤程 纤程(fiber): 相当于用户级别的线程或轻进程.纤程由Win32库函数支持,对核心是不可见的.纤程可以通过SwitchToFiber显示至另一合作纤程,以实现合作纤程之间的协同.线程是在Wi ...
- 爆炸快求1~n有多少素数
这个求一千亿以内的素数大约用6780ms #include <stdio.h> #include <iostream> #include <string.h> #i ...
- css3 滚动条出现 页面不跳动
.wrap-outer { margin-left: calc(100vw - 100%); } .wrap-outer { padding-left: calc(100vw - 100%); } ...