c++ 数据类型不算很多但很复杂,学好C++的关键我认为是要熟练掌握其常用数据类型,废话少说上菜!
c++ 数据类型大概可以分为:内置类型,标注库类型(或者说是类类型),内置类型大致来说是能够转换为数字的类型包括 bool ,char ,wchar_t,short,int long,float,double,long double这么几类,和其他高级语言很类似,只是根据机器不同有些类型的取值范围(或者说是存放的字节长度)不一样。需要特别说明的是wchar_t,它叫宽字符类型,是对标准字符型的扩展,因为标准字符型占一个字节,但是有些扩展字符不是这样,比如一个汉字需要占用两个字节,但单汉字确实也属于字符型,这个时候wchar_t就出马了,如果定义一个内容为单汉字的字符变量就需要声明为wchar_t而不能使char。
在内置类型中,除了布尔类型,有些类型可以是带符号的也就是说可以为整值也可以为负值,也可以强制一个类型定义时不带符号,等同于只有正值。类型的默认符号如下:
int short long 默认带符号,不想带符号需要好强制定义,如下所示:
int a = 1; 等同于 signed int a = 1;
unsigned int a = 1; 强制定义了一个不带符号的整形变量
无符号类中,符号位会被当成数据内容,所以无符号值要比带符号值正数范围对以为,假如有符号char 能表示 -127---127 的范围,无符号值范围则是0---255
c++中变量的初始化更具类型不同而不同,内置变量初始化如下:
int a; 会调用该变量类型的默认初始化器,内置类型一般会被默认初始化为0
int a = 1; 复制(不是赋值)初始化为1
int a(2); 直接初始化为2 该初始化效率最高且最灵活
内置类型如果以 int a; 形式定义变量,系统是否会初始化该变量取决于变量定义的位置,在函数体外定义会初始化为0,函数体内定义的内置类型变量不会被初始化,但是系统建议用户最好不要依赖系统行为,在定义显示的初始化该变量。
在很多语言中,申明和定义对象没有太大的区别。在C++中却是两个不同的概念。
申明对象,表示说有这么一个类型的变量X存在,语法是 : extern int i ; 当系统运行到这里时表示系统中有一个INT类型的叫I得变量存在,系统不会真正创建该对象不会非配系统资源出来。
定义对象,就是一般我们说的创建变量操作 int i = 0; 表示为名为I的INT变量非配了资源,其值为0。
申明和定义对象的典型用法是:在一个共同的头文件中定义了好几个系统及的变量,多个INCLUDE该头文件的文件中就可以申明这些变量,然后在本文件其他地方直接使用。
需要注意的是一个变量可以被申明多次,但只能定义一次。标准申明不能初始化值,如果初始化值则表示申明并定义了该对象。其他地方就不能在定义该对象只能申明。
extern int i = 1; 等同于 int i = 1;
c++常量 const 不同于有些语言,可以是编译时常量,也允许运行时常量。
int a = 123;
const int b = a; 运行时常量
const int c = fun(); 运行时常量
const int d = 123; 编译时常量
常量也可以被申明和定义。不同于非常量的定义,如果在头文件中定义如下:
const a = 123 ;
然后在引用头文件的文件中申明改变量是不允许的,因为常量的定义范围默认是局限于所定义的文件中,其他文件中想要申明并使用者常量则需要定义常量时候增加关键字 extern 如下所示:
extern const a = 123 ; 这时候其他文件中才可以安全的申明并使用改常量。
const a = 123; 与 extern const a = 123 并不等同,这点和变量不一样。只有在定义时候加了 extern 才可以在其他文件内被申明使用。
c++中有一类叫引用类型的类型,可以吧它当成是被引用变(常)量的“全权代理”对它的操作和对被应用变量的操作效果完全一样。当然,引用类型如果是常量除了使用该引用值外不能做任何更改操作。
int a = 1;
int &ar = a;
ar = 2; 等同于 a = 2
以下着两个常量引用无法做任何的需该操作。
const int a = 1;
const int &ar = a;
const int &ar1 = 2;
c++的字符串类型是标准库中定义的,它有一个获取长度的方法size(),返回值不是通常意义上的INT型,而是一个 string::size_type 类型.
Vector<T>是标准库中定义的范型集合类,它有一个获取长度的方法size(),返回值是一个 Vector<T>::size_type 类型.类型成员可以通过下标操作,也可以通过迭代器解引后操作,两种写法如下:
vector<int> arr(10,1);
for(vector<int>::size_type cur = 0; cur != 10; ++cur)
{
arr[cur] = 0;
}
for(vector<int>::iterator item = arr.begin(); item != arr.end(); ++arr)
{
*item = 0;
}
两种写法功能一样,都是吧所有元素值设置为1。需要注意的是迭代变量的赋值需要解引在操作。
Vector<T>类型是可变类型,可以随时通过方法Vector<T>.push_back(T) 在末尾增加列表项。
还有一种类型vector<T>::const_iterator, 和 vector<T>::iterator 用法类似,只是无法对解引值做更改。