数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。
本章主要介绍C++ 基本类型,从内置类型如int double,到复合类型如 指针 引用,还有自定义数据结构。其他内容有变量的声明定义,const 限定符等。
1 基本内置类型
C++ 内置类型主要有:
算术类型:整型,浮点型,字符型,布尔型。
空类型: void
类型 | 含义 | 最小尺寸 |
bool | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整形 | 16位 |
long | 长整形 | 32位 |
long long | 长整形 | 64位 |
float | 单精度浮点 | 6位有效数字 |
double | 双精度浮点 | 10位有效数字 |
long double | 扩展精度浮点 | 10位有效数字 |
算术类型的尺寸在不同的机器上有所差别,所以只给出了最小尺寸。
这些基本类型大都还有带符号和无符号类型两种。使用无符号类型如:unsigned int ,指大于0的整型,且范围加倍。
如何选择类型:1 明确知道数值不为负时,用无符号类型 2 整数用int ,浮点用double
类型的转换。程序一般会自动转换,但是可能会丢失信息,如:
double num = 30.0;
int i = num;
另外,当赋给无符号类型一个超出范围的值时,结果是未定义的,所以切勿混用带符号和无符号类型,并对类型的范围了然于胸。
字面值常量
整型主要有十进制,八进制(以0 开头),十六进制(以0x 开头)。
字符和字符串字面值:单引号括起来的为char 型字面值,双引号括起来为字符串字面值(实际是由常量字符构成的数组,末尾自动添加 '\0')。
转义序列:
\n 换行符
\v 纵向制表符
\r 回车符
\f 进纸符
\t 横向制表符
\a 响铃符
\b 退格符
其他特殊字符都需要用\ 来转义。2 复合类型
复合类型是指基于其他类型定义的类型,主要有引用和指针。
引用。引用为对象起了另外一个名字,指向另外一种类型,所以引用必须被初始化。定义引用如下:
int ival = 1024;
int &refVal = ival;
指针。指针是指向另外一种类型,无须定义时初始化。定义指针如下:
int *p1;
int ival = 1024;
int *p2 = &ival;
指针的使用:1 初始化。虽然定义指针时可以不被初始化,但是初始化所有指针无疑能防止许多错误 2 利用指针访问对象,如:cout<<*p2; 3 结束使用之后赋空。空指针不指向任何对象,方法为 int *p1 = nullptr; 或者 int *p2 = 0;
3 自定义数据类型
主要有结构体和类。其唯一区别是结构体默认访问限制为public,而类为private。
定义一个结构体:
struct Clock
{
int hour;
int minute;
};
确保头文件多次包含的技术为预处理器。其中一项功能是头文件保护符,如下:
#ifndef CLOCK_H
#define CLOCK_H
struct Clock
{
int hour;
int minute;
};
#endif
良好的习惯应该在每一个自己的头文件中都加入此头文件保护符。
变量
初始化和赋值不同。初始化比声明空对象之后赋值效率更高。
C++ 11 支持列表初始化,如:
int num = 0;
int num = {0};
int num{0};
如果定义变量时没有指定初值,则变量会被默认初始化(一般为 0)。所以建议定义变量时就初始化,并且在要用到变量的时候才定义。
C++ 支持分离式编译,允许将程序分割成多个文件,可独立编译。这样如果我想使用另一个文件中的变量呢?如下:
extern int i;
这是声明此变量,如果赋值就成为了定义。
变量命名规范:1 有实际意义 2 一般用小写字母 3 自定义类名用大写字母开头 4 标识符若由多个单词组成,用下划线或大写字母隔开
const 限定符
使用const 定义的变量,它的值不能被改变,所以定义时必须初始化,如:
const int bufSize = 512;
const还可用于定义函数与类成员函数,这个以后用到再说。
处理类型
类型别名。使用typedef 或者using 声明给类型起别名,如:
typedef unsigned int uint;
typedef unsigned short uint16;
typedef unsigned long uint32;
using SI = sales_item;
C++ 11 新标准中auto 类型说明符能让编译器自动推导类型,所以也必须有初始值,如:
auto i = 0;
新标准中还有decltype 说明符选择并返回操作数的数据类型类型,如:
decltype (f()) sum = x;