面向对象编程设计并扩展自己的数据类型
#include<iostream>
int main()
{
using namespace std;
int auks,bats,coots;
auks=19.99+11.99;
bats=(int)19.99+(int)11.99;
coots=int(19.99)+int(11.99);
cout<<"auks = "<<auks<<",bats = "<<bats;
cout<<", coots = "<<coots<<endl;
char ch='Z';
cout<<"the code for "<<ch<<" is ";
cout<<int(ch)<<endl;
cout<<"yes,the code is ";
cout<<static_cast<int>(ch)<<endl;
return 0;
}
一、 变量
1.1变量名
-名称中只能使用字母字符、数字和下划线(_)。
-名称第一个字符不能是数字。
-区分大写字符与小写字符。
-不能将关键字用作名称。
1.2 整型 整数就是没有小数的部分。整型共有short、int、long、long long类型。 c++检查类型长度sizeof运算符返回类型或变量长度,单位为字节(sizeof(int))。 头文件climits,该文件指出其编译器中类型的限制类型(例如INT_MAX表示类型int能够储存的最大值)。
1.3 无符号类型
上面介绍的4中类型都有一种不能储存负数值的无符号变体,其优点是可以增大变量能够储存的最大值。要创建无符号版本的基本整型,只需使用关键字unsigned来修改声明即可
-unsigned short number;
-unsigned change;
注意:unsigned本身是unsigned int 的缩写。
1.4 选择整型类型
通常,int被设置为对目标计算机而言最为“自然”的长度,自然长度指计算机处理效率最高的长度,如果没有非常有说服力的理由来选择其他类型,则应使用int。
1.5 整型字面值
整型字面值(常量)是显示地书写的常量,c++能够以三种不同的技术方式书写整数:基数10(十进制)、基数8(八进制)、基数16(十六进制)。
无论以10、012或0xA哪种方式书写,都将以相同的方式储存在计算机中--被储存为二进制数(以2为基数)。
1.6 char类型:字符和小整数
char类型是专为储存字符(如字母和数字)而设计的类型。它足够长,能够表示目标计算机系统中所有基本符号--所有的字母、数字、标点符号等。
char字面值(ASCLL码)
-'A'为65,即字符A的ASCLL码;
-'a'为97,即字符a的ASCLL码;
-' '为32,即空格字符的ASCLL码;
-'!'为33,即感叹号的ASCLL码;
-具体请详见ASCLL表。
wchar_t类型(宽字符类型)可以表示扩展字符集。wchar_t类型是一种整数类型,它有足够空间,可以表示使用的最大扩展字符集(例如程序需要处理的字符集可能无法用一个8位的字节表示则可以使用whcar_t)。
新增char16_t和char32_t类型。
1.7 bool类型
在计算中,布尔变量的值可以是true或false。C++将非零值解释为true,将零解释为false。可以使用bool类型来表示真和假,它们分别用预定义的字面值true和false表示。 可以这样编写语句:
bool is_ready = true;
字面值true和false都可以通过转换提升为int类型,true被转换为1,而false被转换为0;
int joke = true; //joke assigned 1
int wanna = false; //wanna assigned 0
另外,任何数字值或指针值都可以e被隐式转换为bool值。任何非零值都被转换为true,而零被转换为false:
bool yeah = -100; //yeah assigned true
bool beat = 0; //beat assigned false
二、cost限定符
程序在多个地方使用同一个常量,则需要修改该常量时,只需修改一个符号定义即可。这种方法就是使用const关键字来修改变量声明和初始化。
const type name = value;
常量(name)被初始化后,其值就被固定了,编译器将不允许再修改该常量的值。
三、浮点数
3.1 浮点类型,它们时C++的第二组基本类型。浮点数能够表示带小数部分的数字,计算机将这样的值(例如3.14159)分成两部分储存,一部分表示值,另一部分用于对值进行放大或缩小。放大或缩小因子的作用是移动小数点的位置,术语浮点因此得名。
书写浮点数:d.dddE+n指的是将小数点向右移动n位,而d.dddE-n指的是小数点向左移动n位。
四、C++算术运算符
C++基本算术运算符:
1)+运算符对操作数执行加法运算符。
2)-运算符从第一个数中减去第二个数。
3)*运算符将操作数相乘。
4)/运算符用第一个数除以第二个数。如果两个操作数都是整数,则结果为商的整数部分。
5)%运算符求模。生成第一个数除以第二个数后的余数。
3.2 运算符优先级和结合性
C++使用优先级规则来决定首先使用哪个运算符。算术运算符遵循通常的代数优先级,先乘除,后加减。当两个运算符的优先级相同时,C++将看操作数的结合性是从左到右,还是从右到左。从左到右的结合性意味着如果两个优先级相同的运算符被同时用于同一个操作数,则首先应用左侧的运算符,从右到左的结合性则首先应用右侧的运算符。
3.3 除法分支
除法运算符(/)的行为取决与操作数的类型。如果两个操作数都是整数,则C++将执行整数除法。这意味着结果j的小数部分将被丢弃,使得最后结果是一个整数。如果其中有一个或两个操作数d是浮点数,则小数部分将保留,结果为浮点数。
注意:浮点常量在默认情况下为double类型。
3.4 类型转换
C++自动执行很多类型转换:
1)将一种算术类型的值赋给另一种算术类型变量时,C++将对值进行转换;
2)表达式中包含不同的类型时,C++将对值进行转换;
3)将参数传递给函数时,C++将对值进行转换。
通常将一个值赋值给取值范围更大的类型通常不会导致什么问题。但有写转换是不安全的:
|
| 转换 | 潜在的问题
| 将较大的浮点类型转换为较小的浮点 | 精度(有效数位)降低,值可能超出目标类型的取值范
| 类型,如double转换为float | 围,在这种情况下,结果是不确定的
|
| 将浮点类型转换为整型 | 小数部分丢失,原来的值可能超出目标类型的取值范围
| | 在这种情况下,结果是不确定的
|
| 将较大的整型转换为较小的整型,如 | 原来的值可能超出目标类型的取值范围,通常只复制右
| 将long转换为short | 边的字节
将0赋给bool值时,将被转换为false;而非零值将被转换为true。
3.5 表达式中的转换
自动转换:在计算表达式时,C++d将bool、char、unsigned char、signed char和short值转换为int。这些转换被称为整型提升。
当运算涉及两种类型时,较小的类型将被转换为较大的类型。
C++转换校验表:
(1)如果有一个操作数的类型时long double,则将另一个操作数转换为long double.
(2)否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。
(3)否则,如果有一个操作数的类型是float,贼将另一个操作数转换为float。
(4)否则,说明操作数都是整型,因此执行整型提升。
(5)在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,贼转换为级别高的类型。
(6)如果有一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。
(7)否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
(8)否则,将两个操作数都转换为有符号类型的无符号版本。
3.6 强制类型转换
C++还允许通过强制类型转换机制显示地进行类型转换。强制类型转换不会修改变量本身,而是创建一个新的、指定的值,可以在表达式中使用这个值。
(typeName)value;
typeName(value);
static_cast<>可用于将值从一种数值类型转换为另一种数值类型。
static_cast<typeName>(value);
运算符static_cast<>比传统强制类型转换更严格。
注意:将值转换为int,然后相加得到的结果,与先将值相加,然后转换为int都是不同的,至少对于这些值来说是不同的。
aotu 初始化声明:使用关键字auto,而不指定变量的类型,编译器将把变量类型设置成与初始值相同。