算数类型
基本类型就是int,double, long long,这一系列东西。
其中有个特殊的类型是wchar,这个符号代表本机上支持的最大的扩展字符级的字符。
(有的机器上有些扩展字符级比较大,所以需要更长的扩展字符来处理)
一般情况下,浮点数就用double就好了。
每一种字符还被分为了char和signed char,unsigned char等几种,其中signed会比unsigned少一位表示区间,一般来说是-1和0,然后向两侧蔓延。
类型转化
没什么好说的,最常见的就是越界导致的数值丢失,以及不合理的类型的赋值。需要人工去解决。
字面值常量
字面值代表赋给对手一个值,比如可以给int赋给以0打头的一个值,表示八进制,也可以给0x表示十六进制。
但要注意的是十六进制最后也是要被翻译成二进制存储的,所以最大值不能超过int的限制。
同时,‘a'代表字符,"afsd"代表一个字符串,字符串的实际存储中有一位是‘0’。
变量
变量其实是一种对象。
变量可以分为初始化和赋值两个部分。这两个步骤本身就难解难分。
只需要记住,变量通常都有自己默认的赋值变量,如果在初始化的时候指定特有的值,那也是初始化,因为这个过程中不涉及变量值的擦除。
初始化的定式其实很标准,那就是,=与数值的直接组合,=与{}包裹的数值的组合,直接在变量名后加()的组合。
变量声明与定义的关系
声明和定义可以分开的,这主要是通过extern 关键字来实现的。
这是为了解决同一个变量在众多的文件里都需要使用的问题。
标识符和作用域
标识符就其实就是起的各种名字,在不同情况下,当然有不同的规范。
作用域就是花括号外的可以用花括号外的。在花括号内的无法影响到花括号外的。
复合类型
其实复合类型很简单,包括 int &p,其中p是引用,值得是绑定到目标对象上的别名,而int *p是一个真正有存储空间的对象。
无论是指针还是引用,都可以先定义,再赋值。
如何赋值指针?
如何赋值引用?
如何解使用指针?
指向指针的指针的指针,就是一个不断在int后加*号的套娃,一层一层的套。
引用绑定一次终身绑定,但指针是可以改的。
所以就有了p = &d;
当然最骚的是这个标示符 int *&r = p, 这代表了r 是一个指针的引用,可以发现,指针是一种特殊的类型,而后才是引用符号。诀窍是,从右向左读,越靠近变量的作用越明显,int* &r,先是个引用,然后是指针。
Const
这个东西,简直是让人想死。
它的实质是在一个变量初始化之后,这个东西就不可以改了。
const如果想要在一个文件中定义,在不同的文件中引用该怎么办?
很简单,只需要在const前面加上extern就可以了。
const的特殊性在于const的指针分为指针指向的目标是常量,还是指针本身是一个常量。
一般是指向常量的指针,const int *p
但指针的常量是 int * const p,还是从右往左看,最前面的范围更大。先声明const是什么,然后是int*的类型。
有一个典型的读法:p is a point to int const. 遇到就替换成point to,遇到p,就替换成p is a.然后int * const p 就是 p is a const point to int.那就是指向int的常量指针。
constexpr和常量表达式
const是指值不会改变并且在编译过程就能得到计算结果的表达式。
两个条件,首先要const这样才能在编译过程中获得,其次要是赤裸裸的值,不能是一个函数,需要在运行时才能获得结果。
constexpr变量
这个机制是人为的指定在赋值的过程中进行编译。其实和const一样。
但是constexpr是有限制的,比如自定义的类,string等都不能被定义。并且constexpr可以定义一些简单的函数表达,这和const不同。
这个东西,可能是应用在嵌入式开发的吧,以后再熟悉。
处理类型:typedef,using
1.类型是难于拼写的,类型多了就很烦。
2.代码一长,根本搞不清楚类型是什么,需要回头寻找帮助。
(我觉得这完全不是问题啊,以我目前的开发经验,没有遇到过这种情况)
只要知道两种方法,一种是typedef,一种是using 就行。
AUTO
Auto不需要知道太多
注意auto在推断的过程中,有可能是和初始值不同。
decltype类型指示符
decltype的意思是可以自动推测表达式的类型,然后用推测出来的类型去赋值一个东西。
比如 decltype(a) b =1, 这个b就是a的类型。
自定义数据结构
其实就是struct,这个没啥说头。
唯一的要求就是希望建立struct的时候,struct分开写。
编写自己的头文件 #ifdef
我们通常把string,自定义类放在一个头文件中,然后在main函数中加上.h文件中。
这个过程中,其实是一个预处理器的处理过程,这个过程竟然是在编译之前的。
当预处理器看到# include 时,就会直接用头文件对#include进行替换。
有一个特性是头文件保护符,这个保护符其实是验证头文件中的是否成功加入到了代码中。
这个东西,为了保证唯一性,一般是和头文件的#include一起添加的。
只要无脑添加这个东西就行。