类型主要是用来告诉我们数据代表什么意思,对数据该执行什么操作。
1.1 基本数据类型
C++中有布尔型、字符型、整型、浮点型等。(其中整数、字符和布尔的算术类型合称为整型).它与在计算机存储器中的表示方式紧密相关。计算机以位序列存储数据,每位存储0或1.通常在计算机中int存储长度为1个机器字长。
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 bool bl=true; 6 char cr=‘s‘; 7 short st=1; 8 int i=0; 9 long lg=1; 10 float ft=1.0; 11 cout<<sizeof(bl)<<endl; 12 cout<<sizeof(cr)<<endl; 13 cout<<sizeof(st)<<endl; 14 cout<<sizeof(i)<<endl; 15 cout<<sizeof(lg)<<endl; 16 cout<<sizeof(ft)<<endl; 17 return 0; 18 }
其在计算机中存储的长度为:
1
1
2
4
4
4
1.2 越界处理
当我们给指定类型赋值,但是超过了指定类型的长度,那么编译器就会对其的可能取值数目求模,然后取得所求值。
例如:
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int main() 5 { 6 unsigned char cr=‘a‘; 7 cout<<setw(20)<<(int)cr<<endl; 8 cr=300; 9 cout<<setw(20)<<(int)cr<<endl; 10 cin>>cr; 11 return 0; 12 }
对于第6行,根据char的模的值为256,若把数据类型改为signed,输出结果相同,为:
97
44
但是倘若我们的cr的值在第8行若为赋值,那么结果就会有所不同了。如当cr的值为-1时:
对于signed char其值的表示范围为-128-127,那么输出结果为:
97
-1
对于unsigned char其值的表示范围为0-255,那么输出结果为:
97
255
1.3 类型检查
C++是一种静态类型语言,在编译时会做类型检查。在操作时,数据类型以及表达式是否合法是通过编译器检查的,如果不合法,那么编译器就会提示错误,而不会产生可执行文件。所以,在我们使用变量的时候必须首先确定变量的类型。
1.4 初始化
对于变量定义,我们要确定他的类型和标识符(可以是字母、数字、下划线),当然还可以给对象提供一个初始值。初始化变量有两种方式:
直接初始化 int i(0);
复制初始化 int i=0;
1 string all_nines=(3,‘9‘);//直接初始化,里面通过一个计数器和一个‘9’字符初始化对象。 与第二行的表达式等价。 2 string all_nines="999";//复制初始化 3 cout<<all_nines<<endl;
在以往中经常使用例如int i=0;但是要搞清楚,初始化不是赋值,赋值是擦除对象的当前值,然后再给他赋予新值。直接初始化的语法更灵活且效率更高。对于内置类型的来说,直接初始化与复制初始化几乎没有什么差别。对于类类型有些初始化只能用直接初始化。
1.5 变量的声明和定义
变量的定义:用于为变量分配存储空间,还可以为其指定初始值。
变量的声明:只是用来向程序表明变量的类型和名字。可以使用extern关键字声明变量名而不定义它,也就是说extern并没有在内存里开辟空间,只有当extern位于函数外才可以包含初始化式。例如可定义为:extern int i=1;
程序中可以多次声明,但是只能定义一次。
1 extern int i;//申明但是并不定义 2 int i;//申明
在多个文件中使用的变量都需要与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。
1.6 引用
非const引用只能绑定到与该引用相同的类型。
const引用可以绑定到不同但相关的类型的对象或绑定到右值。
1 int ival1=2; //引用就是别名 2 double dval=2.3; 3 int &ival2=ival1; 4 const int x=2; //const是指向const对象的引用 5 const int &x1=x; 6 const int &x2=x1+ival1; 7 //int &val=dval; 非const对象只能引用到同类型 8 const int &val=dval; 9 cout<<ival2<<endl; 10 cout<<x1<<endl;