数据类型
还是常见的那几种,int,bool,char,double,float。
关键字有signed,unsigned。
值得注意的是,书中给出了编程时选择数据类型的几条建议
- 当明确知道数值不为负,选择用无符号数
- 使用int做整数运算(short一般太小,int和long一般大小一样,超过int范围,用long long)
- 算数表达式不要使用char和bool,只有在用字符和bool时再用
- 浮点数运算一般用double,原因是float精度时常不够,而double计算代价与float相差无几,某些机器甚至效率要优于float。
类型转化
还是一般情况,会导致数据的精度出现变化,另外有一些特例要了解一下。
- 算数值给bool,初始值是0则为flase,否则为true
- bool给算数值,初始为flase则为0,反之则为1
- 给无符号类型赋值,超过范围,结果是对无符号总数取模后的余数
- 给有符号类型赋值,超过范围,结果是undefined,程序的运行结果就比较危险了,无法预知
- 不要混用带符号数和无符号数,带符号数会自动转成无符号数
字符串
"A"和'A'长度是不一样的,"A"编译器会在末尾加一个'\0'所以"A"长度比'A'多1。
变量
没什么好说的,变量类型加变量名就声明完成了例如
int X
X就是一个int变量。
变量命名规范
- 能体现实际含义
- 变量名一般用小写
- 自定义的类名一般以大写字母开头
- 若由多个单词组成,则单词间应该有明显区分
作用域
大多数作用域以花括号分割,一般有全局作用域和块作用域。
引用
是变量的别名
&d
int ival = 2021;
int &refval = ival;
引用在被定义时必须被初始化
int &refival2;
这用用法是错误的
定义了引用之后,对它的操作都是在被绑定对象上进行的
引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起,另外引用和被绑定的值类型要一致。如:
int &ival=1;
double val1 = 1.0;
int &ival2 = val1;
是错误的
指针
指向另外一种类型的复合类型。
指针和引用的区别
- 指针本身是一个对象,允许对指针赋值和拷贝
- 指针无需在定义时赋初值。
声明方式
*d
int *ip1, *ip2;
指针存放对象的地址,要获得这个值,需要用取地址符 &
因为引用不是对象,没有实际地址,所以不能定义指向引用的指针
指针的值
一个指针应属于下列4种状态
- 1.指向一个对象
- 2.指向紧邻对象所占空间的下一个位置
- 3.空指针
- 4.无效指针
利用指针访问对象
若指针指向了一个对象,可以使用解引用符 * 访问该对象
空指针
如何获得空指针
int *n1 = nullptr;
int *n2 = 0;
int *n3 = NULL;
引用一经定义就不能再改变值,而指针可以。
只要指针非0,条件判断就位true
两个指针比较,如果存放的地址值相同则为true
void * 指针
可以存放任意对象的地址
如何看符合数据类型
int *&p;
一个对指针p的引用,p是什么看离p最近的符号。(ps,有就近原则那味道了)
const限定符
值不能变的变量(像java里的static),这种变量必须被初始化,默认状态下,const对象仅在文件内有效,若要多个文件共享,要在const前加extern
const引用(常量引用)
传引用不会新创建一个变量然后进行拷贝,而是直接传对象,速度快,同时保证了在函数内部无法对对象进行修改。
常量引用不能直接给普通引用赋值。
const引用只是限制了引用可参与的操作,而没有限制被引用的对象本身是不是一个常量。
这里的逻辑关系用王者荣耀里的概念替换可以理解为
众所周知,游戏里橘右京的别名是橘子
现在规定,可以通过别名查到英雄的信息
但是不能用别名修改英雄的信息
这里,橘右京是被引用的对象,橘子是一个引用,和别的玩家交流的时候,可以用橘子来简单代表橘右京,作了规定之后(就是添加了一个const修饰符)只能通过橘右京来修改它本身的英雄信息,不能通过橘子来修改。