`

C++数据类型(From:C++ Primer)

 
阅读更多

3.1 文字常量

  • 字符型char,通常用来表示单个字符和小整数
  • 整型int、短整型short、长整型long
  • 浮点型float、双精度double和长双精度long double

文字常量:“文字”是因为只能以它指的形式指代它,“常量”是因为它的值不能被改变。

每个文字常量都有相对应的类型,且都是不可寻址的。

整数文字常量的三种形式:十进制、八进制(前面加一个0)、十六进制(前面加0x

默认,整型文字常量被当做是一个int型的有符号值,文字常量后加“L”,将其指定为long类型,也可以在整型文字常量后加“U,指定它为无符号数。扩展精度用“L”表示。

 

科学计数法:“f”“F”“L”“l”只能用在十进制中。

 

宽字符:字符常量前加“L”,例如:L”a”。类型为wchar_t

如果两个字符串或宽字符串在程序中相邻,C++会把它们连接在一起,并在最后加上一个空字符。注意:不要将一个字符串与宽字符串连接。

3.2 变量

变量和文字常量都有存储区,也有相关的数据类型,区别是变量时可寻址的。

对于一个变量,

  • 它的数据值,存储在某个地址中。——右值。文字常量和变量都可以用作右值。
  • 它的地址值,数据存放的内存地址。——左值,文字常量不能用作左值。

 

一个简单的定义指定了变量的类型和标示符,它并不提供初始值。如果一个变量是全局变量,那么系统会保证提供初始值给该变量。未初始化的对象不是没有值,而是它的值是未定义的。(与它关联的内存区含有一个随机的位串,可能是以前使用的结果)

 

C++初始化的两种方式:

  • 使用赋值操作符
  • 初始值放在标示符后的括号中,例如:int ival(20);
  • 每种内置数据类型都支持一种特殊的构造函数语法,可将对象初始化为0。例如int val=int(); double dVal = double();

3.3 指针

指针变量最好写成:string *fp ; 解引用符号挨着标识符。

当指针为0值时,表示没有指向任何对象。指针不能持有非地址值,指针不能被初始化或赋值为其他类型对象的地址值。

 

空(void*)类型指针,可以被任何数据指针类型的地址值赋值(函数指针不能赋值给它)。void*表示相关的值是地址,但该地址的对象类型未知,我们不能操作空类型指针所指向的对象,只能传送该地址值或将它与其他地址值做比较。

 

指针的算术运算符(增加或减少)

加法:针对指针的加法总是认为是数据对象的加法,而不是离散的十进制加法。例如:指针加2表示给指针持有的地址增加了该类型两个对象的长度。

3.4 字符串类型

C++提供两种字符串的表示:C风格的字符串和标准C++引入的string类型。建议使用string类。

要使用C++标准库的string类型,需要加入#include <string>

3.5 const限定修饰符(重要)

const类型限定符将一个对象转换成一个常量。因为常量在定义后就不能被修改,所以必须进行初始化任何“试图将一个非const对象的指针指向一个常量对象”à编译错误。

 

const double *cptr ;

cptr是一个指向double类型的const对象指针。读为:cptr是一个指向double类型的、被定义成const的对象指针。cptr本身不是常量,可以重新复制给cptr,但不能修改cptr所指向的对象。const对象的地址只能赋值给指向const对象的指针,但是指向const对象的指针可以被赋予一个非const对象的地址。指向const的指针常被用作函数的实参。

 

int errNumb = 0 ;

int *const curErr = &errNumb;

curErr是一个指向int类型对象的const指针。不能赋给curErr其他的地址值,但可以修改curErr指向的值。

3.6 引用类型

引用有时候又称为别名(alias)。

定义方式:

int iVal = 1024;

int &refVal = iVal;——refVal是一个指向iVal的引用。引用必须初始化为指向一个对象。

int *pi = &iVal;

int *&ptrVal2 = pi;——ptrVal2是一个指向int指针的引用。引用一旦已经定义,就不能再指向其他对象。引用的所有操作实际上都被应用在它所指的对象上,包括取地址符。

 

const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。不允许非const引用指向需要临时对象的对象或值。

double dval = 3.14159;

// 仅对于const引用才有效

const int &ir = 1024;

const int &ir2 = dval;

const double &dr = dval + 1.0;

 

实际的C++程序很少使用指向独立对象的引用类型。引用类型主要被用作函数的形参和作为返回值

3.7 布尔类型

布尔类型:true/false。当表达式需要一个算术值时,布尔对象和布尔常量都被隐式提升为intfalse变成0true变成1

3.8 枚举类型

enum open_modes{ input = 1, output, append};

C++不支持在枚举成员之间的前后移动。在缺省情况下,第一个枚举成员被赋以0,后面的每个枚举成员依次比前面的大1。也可以显示地把一个值赋给一个枚举成员,这个值不必是唯一的。

// point2d = 2, point2w = 3, point3d = 3, point3w = 4

enum Points{ point2d = 2, point2w, point3d = 3, point3w};

 

枚举类型可以参与表达式运算,可以作为参数传递给函数,也可以被初始化,但只能被一个相同枚举类型的对象或者枚举成员之中的某个值初始化或赋值。

3.9 数组类型

字符数组可以用一个由逗号分开的字符文字列表初始化,文字列表用花括号阔起来,或者用一个字符串文字初始化。注意:这两种方式是不等价的,字符串常量包含一个额外的终止空字符。例如:

const char ca1[] = {‘C’, ‘+’, ‘+’};

const char ca2[] = “C++”;

一个数组不能被另外一个数组初始化,也不能被赋值给另外一个数组。而且,C++不允许声明一个引用数组(由引用组成的数组)。

3.10 vector容器类型

string类一样,vector类是随标准C++引入的标准库的一部分。为了使用vector,必须包含#include <vector>

两种形式:

1、数组习惯:vector<int> ivec(10);int ivec[10]相似。

访问vector元素与内置数组一致。

2、STL习惯:vector<int> ivec;

定义一个空vector,再向vector中插入元素。例如:push_back()插入元素。使      用vectorbegin()end()所返回的迭代器(iterator)进行循环。iterator是标准库的类,具有指针的功能。

3.11 typdef 名字

typedef提供了一种通用的类型定义设施,可以用来为内置的或用户定义的数据类型引入助记符号。typedef定义以关键字typedef开始,后面是数据类型和标识符。

考虑:typedef char *cstring;

         extern const cstring cstr;

请问:cstr的类型是什么?

答:char *const cstrconst修饰的是cstr类型,cstr是一个指针,所以这个定义声明了cstr是一个指向字符的const指针。

3.12 volatile限定修饰符

当一个对象的值可能会在编译器的控制或检测之外被改变,例如:一个被系统时钟更新的变量,那么该对象应该声明为volatile。因此,编译器执行的某些例行优化行为不能应用在已指定为volatile的对象上。volatile修饰符的主要目的是提示编译器,该对象的值可能在编译器未检测到的情况下被改变,因此编译器不能武断地对引用这些对象的代码做优化处理。

3.14 pair类型

pair使得我们可以在单个对象内把相同类型或不同类型的两个值关联起来。为了使用pair类,必须包含#include <utility>

pair<string, string> author(“James”, “Joyce”);

author.first == “James” && author.second == “Joyce”

如果希望定义大量相同pair类型的对象,最方便的做法就是使用typedef

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics