来自《C++ Primer Plus》,虽然是抄自书上,但是我还是将自己的概括能力展现在里面了。按照我以前的学习方式,这些东西,我是不会总结的,但是我如今改变了。因为凡事都需要总结,不论事情大小难易。将小事做到最好也是一件了不起的事。
![](https://img-blog.csdnimg.cn/20190804082600769.jpg)
前言
OOP的本质是设计并扩展自己的数据类型
,在设计自己的数据类型之前,我们必须要了解C++的基本数据类型,因为这些是创建自己类型的基本组件。
内置的C++类型分为两种:基本类型和复合类型,本篇文章是对基本类型的总结。
变量名
给变量起名字是一项很重要的工作,好的命名风格可以便于与同行交流,同时也可以方便后期代码的维护升级。
命名法则
- 只能使用字母、数字、下划线:这与大多数语言是一样的
- 名称第一个字符不能是数字:大多数语言也要求这样
- 区分大小写
- 不能使用关键字
- 以
两个下划线
或下划线和大写字母打头
的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。 - C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。(注意与C区分,C语言只保证名称的前63个字符有意义)
命名约定
这其实是一个很有争议的话题,因为不同的人有不同的喜好,但我在这一点上是一个从众者,我跟随大多数人采用的命名约定(便于交流
)。
如果想用两个或更多的单词组成一个名称,通常的做法有
- 用下划线将单词分开
- 从第二个单词开始将每个单词的首字母大写(有的语言从第一个就开始大写,比如Python中的类名)
初始化
我们这里介绍一下C语言没有但C++有的新的初始化方法
下面的三种初始化方式是等价的
int a = 12;
int a{12};
int a = {12};
大括号初始化器一般用于数组和结构,用于单变量的情况并不多,但C++11使得这种情况更多了。
关于为什么要使用那么多初始化方法,其中一点我很赞同,那就是为了统一
,我们可以将所有的变量、结构、数组的初始化都用大括号初始化器来实现。
整型
C++的基本整型分别是char、short、int、long、long long(C++11),其中每种类型都有有符号和无符号两种版本,因此共有10种。下面只是有符号版本,无符号版本就是在有符号版本前面加上unsigned。
类型 | 字节数 |
---|---|
short | 至少16位 |
int | 至少与short一样长 |
long | 至少32位,且至少与int一样长 |
long long | 至少64位,且至少与long一样长 |
无符号整型
前面的四种类型都有一种无符号变体,其优点是可以增加变量能够存储的最大值。当然,使用这种变体的前提是数据不能为负数。
unsigned short a;
unsigned int b;//<==>unsigned b;
unsigned long c;
unsigned long long d;
整型的选择
下面有几条建议
- int一般被分配与机器的位数一样的长度,选择这种类型,效率会更高。所以,如果没有理由来选择其它类型,就选择int。
- 如果存储的数值不可能为负数,那可以选择无符号变体,这样可以表示更大的数。
- 如果知道变量可能表示的整数值大于16位整数的最大可能值,则使用long。即使系统上int为32位,也应这样做。这样,将程移植到16位系统时,就不会突然无法正常工作。
- 如果数据是一个难以想象的天文数字,那么我们可以使用long long。
- 如果数据很小,我们应当采用short,能省一点是一点。
整型字面值表示
- 如果第一位为1~9,则是十进制
- 如果第一位是0,第二位为1~7,则为八进制
- 如果前两位为0x或0X,则为十六进制
默认情况下,cout是以十进制输出数值,我们可以通过下面的方法来改变它的输出。
#include <iostream>
#include <climits>
using namespace std;
int main()
{
long long e = {222};
cout << hex;
cout << e << endl;
cout << oct
cout << e << endl;
return 0;
}
确定常量类型
机器是如何确定我们给出的整数字面值的类型,如下面
cout << 1234
这个1234到底是什么类型呢?
答案是,除非有理由存储为其他类型,否则C++将整型常量存储为int类型。
我们可以通过后缀来指定字面值的类型,如下,其它的后缀类似
cout << 123ul//ul <==> unsigned
补充知识点:
const相比于#define的好处
- 它能够明确指定类型。
- 其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。
- 第三,可以将const用于更复杂的类型,如数组和结构。
所以我们尽量使用const。而不是#define。
浮点数
和ANSI C一样,C++也有3种浮点类型:float、double和long double。这些类型是按它们可以表示的有效数位和允许的指数最小范围来描述的。
类型 | 位数 |
---|---|
float | 至少32位 |
double | 至少48位,且不少于float |
long double | 至少和double一样 |
浮点数字面值表示
cout << 2.13
cout << 2.13*e3
我们可以直接按照人类可读的方式书写,同时我们也可以采用科学记数法,只是在程序中,"10"被e替代了。
总结
C++对基本类型进行分类,形成了若干个族。类型signed char、short、int和long统称为有符号整型;它们的无符号版本统称为无符号整型;C++11新增了long long。bool、char、wchar_t、有符号整数和无符号整型统称为整型;C++11新增了char16_t和char32_t。float、double和long double统称为浮点型。整数和浮点型统称算术(arithetic)类型。