算术类型的尺寸在不同的机器上有所差别。(尺寸就是所占位数)
空类型:空类型不对应具体的值,仅用于一些特殊的场合
对象的类型定义了对象能包含的数据和能参与的运算,其中一种运算被大多数类型支持,就是将给定的类型转换为另一种相关类型。
算术类型->布尔类型,初始值为0,布尔值为false,否则为true.
布尔类型->非布尔类型,初始值为false,非布尔值为0,初始值为true,非布尔值为1.
浮点->整型,只将浮点数的整数部分赋值给整型。
整数->浮点数,小数部分记为0。(若该整数所占的空间超过了浮点类型的容量,可能损失精度)
给无符号数一个超过其表示范围的值时,结果时初始值对无符号类型表示数值总数取模后的余数。
可以将整型字面值常量写成十进制,八进制或十六进制数的形式
整型字面值具体的数据类型由它的值和符号决定。
浮点型字面值表现为一个小数或以科学计数法表示的指数。
字符和字符串字面值
由单引号括起来的一个字符称为char型字面值
双引号括起来的零个或者多个字符称为字符串型字面值
有两类字符不可直接使用,若要使用需要用到转义序列
一类是不可打印的字符
另一类是在C++中有特殊含义的字符
布尔字面值和指针字面值
布尔:true false
指针字面值:nullptr
变量提供一个具名的、可供程序操作的存储空间。
首先是类型说明符,随后紧跟由一个或者多个变量名组成的列表。
int a = 1, b = 1;
int c = 1;
当对象在创建时获得了一个特定的值,我们说这个对象被初始化。
int a = 1;
变量在定义时么有给定初始值,则变量被默认初始化。
内置类型的变量未被显示初始化,那么它的值由它的位置决定。在函数外默认值为0,在函数内其值是未定义的。
变量的声明规定了变量的类型和名字。
变量的定义规定了变量的类型和名字,还为其申请了存储空间。
任何包含了显示初始化的声明即成为了定义。
变量可以被声明多次,但是只能被定义一次。
字母、数字和下划线组成,必须以字母或下划线开头。
标识符能够体现实际含义。
变量名一般用小写字母。
用户自定义的类名一般以大写字母开头。
标识符由多个单词组成,单词因由明显的区分。
用户自定义的标识符不能出现两个连续的下划线,也不能以下划线紧连大写字母开头。定义在函数外的标识符不能以下划线开头。
始于名字的声明语句,以声明语句所在的作用域的末端为结束。
复合类型是指基于其他类型定义的类型。
引用是为对象起的另外一个名字。
引用不是对象,它只是为一个已经存在的对象起的一个别名。所以引用必须初始化。
数据类型 &引用名称 = 已经存在的数据类型的对象
int a = 1;
int &ra = a;
引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。
指针是一种类型名,一种复合类型名。
指针是一个指向其它对象的对象。
数据类型 *指针变量名
数据类型*指针变量名 = &数据类型变量(等号两端的数据类型保持一致)
int *pb; //未初始化,没有错,但是建议初始化所有指针
int a = 1;
int *pa = &a; //初始化
通过相关章节总结的而不是说只有这些,若感兴趣可自己总结
相同点:
可以通过指针/引用间接访问另外一个对象。
都是复合类型。
不同点:
指针是一个对象,而引用不是。
指针在定义时不是必须初始化,而引用必须初始化。
指针指向的对象可以改变,而引用绑定的对象不能改变。
int i = 1,*p = &i, &r = i;
在同一条定义语句中,虽然基本数据类型只有一个,但是声明符的形式却可以不同。
类型修饰符是声明符的一部分。
当我们希望定义一个值不能改变的变量时
const int j = 42;
只能在const类型的对象上执行不改变其内容的操作。
初始值可以是任意复杂的表达式。
const int i = get_size(); //运行时初始化
const int j = 42; //编译时初始化
int k = 42;
const int ck = k; //用对象初始化const对象时,k是不是const对象都无关紧要
默认情况下,const对象仅在文件内有效,若需要多文件中共享,那么不管是声明还是定义中const变量都添加extern关键字。
初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能够转换成引用的类型即可。
int i = 42;
const int &ri = i; //允许将const int& 绑定到一个普通int对象上
const int &r2 = 42; //r2是一个常量引用
const int &r3 = r1*2; //r3是一个常量引用
PS:只是不能通过常量引用修改其绑定的那个对象的值。没有规定常量引用绑定的那个对象必须是常量。
const double pi = 3.14; //pi是一个常量
const double *cptr = π //cptr可以指向一个双精度常量
double pii = 3.14;
const double *cptr1 = &pii; //没有规定指向常量的指针指向的对象必须是一个常量。
cptr = &pii; //只是说不能通过该指针改变其指向的对象的值,但是可以改变指针的指向。
PS:指向常量的指针:指的是不能通过该指针来修改所指向的对象的值。
指针是对象,允许把指针本身定为常量。
int errNumb = 0;
//常量指针:表明该指针会一直指向初始化时的那个对象
int *const curErr = &errNumb; //常量指针必须初始化
*curErr = 10; //可以通过该指针改变其指向的对象的值
PS:常量指针:指针的指向的对象一经初始化就不能改变,但是可以通过该指针改变其指向的对象的值。
顶层const表明指针本身是一个常量。底层const表明指针指向的对象是一个常量。
更一般的,顶层const可以表示任意的对象是常量。
拷入和拷出的对象必须具有相同的底层资格或者两个对象的数据类型必须能够转换。
(非常量可以转换成常量,反之则不行。)
int i = 0;
const int *cptr = nullptr; //const 靠近类型表明指针指向的是一个常量,底层const
cptr = &i;
int *const cptr1 = &i; //const 靠近变量说明指针本身是一个常量,顶层const
const int *const cptr2 = &i; //表明无法通过cptr2改变i的值,也无法改变cptr2的指向
常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式。
一般来说,如果你认定变量是一个常量表达式,那就把它声明成constexpr类型。
两种方法定义:传统的和C++11的
typedef double wages; //wages是double的同义词,传统的
using SI = Sales_item; //C++11的
常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式。
一般来说,如果你认定变量是一个常量表达式,那就把它声明成constexpr类型。
两种方法定义:传统的和C++11的
typedef double wages; //wages是double的同义词,传统的
using SI = Sales_item; //C++11的