1、变量和基本类型
类型主要是用来告诉我们数据代表什么意思,对数据该执行什么操作。
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;
1.7 typedef名字
typedef可出现在程序的任何位置,其本身并没有引入新的类型,只是现有数据类型的别名。
目的:
隐藏特定类型的实现,强调使用目的。
简化复杂类型定义,便于理解。
允许一种类型用于多个目的,同时使得每次使用该类型的目的更明确。