运算符
各个语言的运算符意义都大同小异,这里只简单的学习一下运算符的重载:
运算符重载指的是相同的符号进行多种操作,比如>>
左移运算符表示将数左移若干位,但是在cin
中,它被重载为输入标志。同样的还有各种算术运算符,根据运算数的类型的不同,被分别重载为int运算,double运算等。
类型转换
由于c++的数据类型众多,在实际编码的过程中总会遇到类型转换方面的问题。c++中的类型转换共有6种形式:
1. 初始化与赋值转换
诸如此类:int i = (int)5.5;
,这也是在c与java种常见的,但是这样做有三个问题:
- 将长度较长的整形赋值给长度较短的整形(eg:long→short)的时候,只取从小数若干位,直到填充该变量为止。
- 将高精度浮点数赋值给低精度浮点数(eg:double→float)的时候会丢失精度,同时有可能会出现转换后的数值大于类型上限,此时会导致转换的结果不定。
- 将浮点数赋值给整型的时候同样会丢失精度,也有可能会出现转换后的数值大于类型上限,此时会导致转换的结果不定。
2. 用{}
方式转换数据
在c++11中添加了使用{}
来进行类型转换,诸如int i {5.5}
,这种转换方式相比上一种方法要更为严格,具体体现在不允许将多位的值传递给少位(即long类型的数据无法转换为short类型,不论long类型的数据初值是多少)
3. 表达式中转换
在表达式中(诸如a = b + c;
),数据类型的转换是根据c++的校验表转换的,具体规则如下:
(转换优先级从高到低)
- 如果有一个操作数的类型为long double,则将所有的操作数转换为long double;
- 否则,如果有一个早操作数的类型为double,则将所有的操作数转换为double;
- 否则,如果有一个早操作数的类型为float,则将所有的操作数转换为float;
- 否则,说明所有操作数都是整形,进行整型提升;
- 如果两个操作数都是有符号或者无符号的,且有级别高低之分(长度不同),则将所有操作数转换为级别最高的类型;
- 若有符号数与无符号数共存,且无符号数级别高于有符号数,则将所有操作数转换为该无符号操作数的类型;
- 否则,如果有符号类型可以表示无符号类型的所有可能值,则将无符号操作数转换为有符号操作数所属的类型;
- 否则,将两个操作数都转换为有符号类型的无符号版本。
简单来说,就是long double > double > float > unsigned long long > long long > unsigned long > long >unsigned int > int >unsigned short > short > unsigned char > char
如有错误,烦请指正。
4. 传递参数时的转换
这个主要在第七章中讲到,传递参数时的转换是由c++函数原型控制。
5. 强制转换
c标准为:(int) 7.5
c++ 标准为:int (7.5)
c++标准如此是为了使其代码风格与函数调用统一。
c++还引入了四个强制转换符,将在第十五章介绍。
6.auto声明
根据所赋初值的类型确定变量的类型,比如auto i = 5
,将对i赋予int类型;auto i = 5.5
,将对i赋予double类型。
auto的使用远非这么简单,将会在后续的学习中逐步深入。
本章(第四章)的章末习题过于简单,略过