这一篇开始来逐步熟悉C++的数据类型比如说:文字常量、变量、指针、字符串、const限定修饰符、引用、布尔、枚举、数组、vector容器、复数、typedef名字、volatile限定修饰符、pair类型以及类 类型。这些数据类型几乎涵盖了大部分C++要用的数据类型结构。下面就逐一来了解一下。
1、文字常量
▪ 字符型char 表示单个字符和小整数
▪ 整型int、短整型short、长整型long 它们分别代表不同长度的整数值
▪ 浮点型float代表单精度浮点数,double代表双精度浮点数,long double代表扩展精 度的浮点数值。
char、int、short、long都是数值类型,可以有符号也可以无符号。最左边的位是符号位,余下的代表数值,如果符号位被置为1则数值被理解成负数;如果是0则为正数。而在无符号的类型中,所有的位都表示数值。一个8位有符号的char 可以代表从-128 到127 的数值而一个无符号的char 则表示0 到255 范围内的数值。
(PS:这个要从二进制说起。8位二进制可以表示从00000000到11111111之间的所有数字。对于无符号数来说,这8位最小可以表示0(对应二进制的00000000),最大可以表示255(对应二进制的11111111)。而对于有符号数来说,第一位表示符号位(正或负),剩余7位表示值,所以值最小可以取0(对应二进制的0000000),最大可以取127(1111111),理论上讲最小可以表示-127,最大的是127,但是由于某些特殊原因(补码规则,这个先就不要理会了,记住就行),二进制数100000000对应的10进制数是-128,而不是0,所以一个8位有符号数可以表示-128到127的值。)
当一个数值,例如1在程序中出现的时候我们称之为文字常量,之所以称之为文字是因为它只能以值的形式出现,称之为常量是因为它的值不能改变。
2、变量
所谓变量,顾名思义就是没有固定值,其值是可变的一个量。假设有这样的一个问题,我们要解决2的10次方可怎样编写程序呢?例如:
#include<iostream>
using namespace std;
int main(){
cout<<"2的十次方为:"<<2*2*2*2*2*2*2*2*2*2<<endl;
return 0;
}
当然了,这是可行的,如果要写2的99次方、199次方、999次方怎么办?总不会要把代码cout<<"2的十次方为:"<<2*2*2*2*2*2*2*2*2*2<<endl;改成cout<<"2的十次方为:"<<2*2*2*......*2(999个2相乘)<<endl;吧?显然这是不可行的,理论上是可行的,但是你能保证不多写一个或者是少写一个吗?(当然,非要钻牛角尖的人就另当别论了)这种蛮力方案在实际运用中其实很少有人用的。其实,还有一种方法可以解决这种蛮力型的操作,例如:
#include<iostream>
using namespace std;
int main(){
// int 类型的对象
int value = 2;
int pow = 10;
cout << value << " raised to the power of "
<< pow << ": \t";
int res = 1; // 保存结果
// 循环控制语句: 反复计算res
// 直至cnt大于pow
for ( int cnt=1; cnt <= pow; ++cnt)
res = res * value;
cout << res << endl;
return 0;
}
上面程序的意思就是:value、pow 、res 以及cnt 是变量它们允许对数值进行存储修改和查询for 循环使计算过程重复执行pow 次。虽然这样写比上面那种蛮力型的方案要优雅一些,但是,它还是有缺点的,因为不可重复使用。要怎样才可以重复使用,以便其他函数也可以调用呢?只需要简单修改可以了,模型如下:
int
pow( int val, int exp )
{
for ( int res = 1; exp > u; --exp )
res = res * val;
return res;
}
这样上面计算2的10次方的代码就可以改写成:
#include <iostream>
extern int pow(int, int);
int main()
{
int val = 2;
int exp = 10;
cout << "The Powers of 2\n";
for ( int cnt=0; cnt <= exp; ++cnt )
cout << cnt << ": "
<< pow(val, cnt) << endl;
return 0;
}
变量是有名字的,这个名字就是标识符。例如上例中的int value=2中的value就是一个变量,它的名字是value,即标识符。可以由字母数字以及下划线字符组成,它必须以字母或下划线开头并且区分大写字母和小写字母。语言本身对变量名的长度没有限制,但是为用户着想它不应该过长。
此外,在C++中还保留了一些关键字,关键字标识符不能再作为程序的标识符使用。下面的一张图表就列出了C++中的关键字全集:
对象的定义
一个简单的对象定义由一个类型指示符后面跟一个名字构成以分号结束例如
double salary;
double wage;
int month;
int day;
int year;
unsigned long distance;
当同类型的多个标识符被定义的时候我们可以在类型指示符后面跟一个由逗号分开的标识符列表这个列表可跨越多行最后以分号结束例如上面的定义可写成
double salary, wage;
int month,
day, year;
unsigned long distance;
下面看一些小例:
1、下列名字哪些是非法的请改正之
(a) int double = 3.14159; (b) vector< int > _;
(c) string namespace; (d) string catch-22;
(e) char 1_or_2 = '1'; (f) float Float = 3.14f;
有问题的是a,c,d,e.因为a,c都是用了保留字(关键字),d用了“-”不对,而e则是以数字开头了,也不对,修正为d:string catch_22;
e: char _1_or_2=’1’;
2、看看区别
指针类型
在前面我们简要地介绍了指针和动态内存分配。指针持有另一个对象的地址,使我们能够间接地操作这个对象。指针的典型用法是构建一个链接的数据结构,例如树tree和链表list ,并管理在程序执行过程中动态分配的对象以及作为函数参数类型。主要用来传递数组或大型的类对象。
每个指针都有一个相关的类型,并且指向内存中的某一个地址。这是所有指针的相同之处,不同之处在于指针指向的类型不同,这就导致了编译器怎样解释特定地址上内存的内容以及该内存区域应该跨越多少内存单元。