C++ 数据处理与规范

2014/09/26 00:53 am posted in  C++

面向对象(OOP)的本质是设计并拓展自己的数据类型C++的命名规则,与C语言一样,但一般以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。

在C++所有主观风格中,一致性和精度是最重要的。

头文件climits(见下表)定义了符号常量,来表示类型的限制

define编译指令是C语言遗留下来的,C++有一种更好的创建符号常量的方法(使用关键字const)

C++11更广泛的支持大括号初始化器。对于变量初始化可以:

int emus{7};
int rheas = {12};

其次,大括号内可以不包含任何东西,在这种情况下,变量将被初始化为零。

以前,C++使用不同的方式来初始化不同的类型,初始化不同类变量的方式不于初始化常规结构的方式,而初始化常规的方式不同于初始化简单变量的方式,通过使用C++新增的大括号初始化器,初始化常规变量的方式与初始化类变量的方式更像。C++11使得将大括号初始化器用于任何类型(可以使用等号,也可以不使用),这是一种通用的初始化语法。

int被设置为对目标计算机而言最“自然”的长度。自然长度止的是计算机处理起来效率最高的长度。如果没有非常有说服力的理由来选择其他类型,则应使用int。

仅当有大整数数组时,才有必要使用short,尽管有时其长度和int是一样的,但要将程序从16位操作系统移动到32位操作系统,则用于存储int数组的内存量将加倍,而short数组不受影响,记住,节省一点就是赢一点

如果要让cout输出十进制、十六进制和八进制,可以使用控制符dec,hex和oct,用来修改格式,使用方式,如:

cout

C++是如何确定常量的类型呢?如cout但由于l和1很像,一般使用大写L。

char可用作字符和小整数

cout.put()函数用来打印一个字符(C++的历史遗留的原因)

基于字符字符的八进制和十六进制编码来使用转义序列,如ctrl+Z的ASCII码为26,对应的八进制为032,十六进制为0x1a,可以用转义序列来便是该字符如�32,x1a。

C++有一种表示特殊字符的机制,它独立于任何特定的键盘,使用的是通用字符名。

使用通用字符名类似于转义序列,通用字符名可以用u或U打头,u后是8个十六进制位,U后面是16个十六进制位。

与int不同的是,char在默认情况下既不是没有符号的,也不是有符号的,是否有符号由C++决定(这也就是用char和wchar_t表示中文时,正数负数均表示“你好”,见下文wchar_t部分)。

如果用char来存储数值,则unsigned char和signed char的差别将非常重要,前者可以表示0~255,后者为-128~127。

如果程序要处理的字符集无法用一个8位的字节表示,如日文汉字系统。对于这种情况,C++的处理方式有两种,首先如果大型字符是实现的基本的字符集,则编译器厂商可以将char定义为一个16位的字节或则更长的字节,其次,使用一个较大的拓展字符集wchar_t(宽字符类型)

wchar_t是一种整数类型,它有足够的空间,可以表示系统使用的最大拓展字符集。

但cin和cout将输入输出看做char流,因此,适用于处理wchar_t类型,iostream头文件的最新版本提供了作用相似的工具——wcin和wcout,可用于处理wchar_t流,另外,还可以单纯加上前缀L来指示宽字符常量和宽字符串。

在进行国际编程或使用Unicode或ISO10646时应注意使用宽字符类型。

在进行字符串编码是,如果有特定长度和符号特征的类型,将很有帮助,因此,C++11使用前缀u(这回注意大小写)来表示char16_t字符常量和字符串常量,用前缀****U来表示char32_t常量。

和wchar_t一样,chat16_t和chat32_t也都有底层类型也都有底层类型(一种内置的整型),但底层类型可能随系统不同而不不同。

const常量比define常量要好些,首先,前者可以明确常量类型,其次,可以使用C++的作用域规则将定义限制在特定范围的函数或者文件中,第三,const可被用于更复杂的数据类型。

C++有3中浮点类型:float、double、long double,float至少32位,double至少48位且不小于float,long double至少和double一样长,通常float为32位,double为64位,long double为80、96、128位(区分在系统),它们的存储范围在cfloat(见下表)头文件中找到。

name value stands for expresses
FLT_RADIX 2 or greater RADIX Base for all floating-point types (floatdouble and long double).
FLT_MANT_DIG DBL_MANT_DIG LDBL_MANT_DIG   MANTissa DIGits Precision of significand, i.e. the number of digits that conform thesignificand.
FLT_DIG DBL_DIG
LDBL_DIG 6 or greater 10 or greater
10 or greater DIGits Number of decimal digits that can be rounded into a floating-point and back without change in the number of decimal digits.
FLT_MIN_EXP DBL_MIN_EXP
LDBL_MIN_EXP   MINimum EXPonent Minimum negative integer value for the exponent that generates a normalized floating-point number.
FLT_MIN_10_EXP DBL_MIN_10_EXP
LDBL_MIN_10_EXP -37 or smaller -37 or smaller
-37 or smaller MINimum base-10 EXPonent Minimum negative integer value for the exponent of a base-10 expression that would generate a normalized floating-point number.
FLT_MAX_EXP DBL_MAX_EXP
LDBL_MAX_EXP   MAXimum EXPonent Maximum integer value for the exponent that generates a normalized floating-point number.
FLT_MAX_10_EXP DBL_MAX_10_EXP
LDBL_MAX_10_EXP 37 or greater 37 or greater
37 or greater MAXimum base-10 EXPonent Maximum integer value for the exponent of a base-10 expression that would generate a normalized floating-point number.
FLT_MAX DBL_MAX
LDBL_MAX 1E+37 or greater 1E+37 or greater
1E+37 or greater MAXimum Maximum finite representable floating-point number.
FLT_EPSILON DBL_EPSILON
LDBL_EPSILON 1E-5 or smaller 1E-9 or smaller
1E-9 or smaller EPSILON Difference between 1 and the least value greater than 1 that is representable.
FLT_MIN DBL_MIN
LDBL_MIN 1E-37 or smaller 1E-37 or smaller
1E-37 or smaller MINimum Minimum representable floating-point number.
FLT_ROUNDS   ROUND Rounding behavior. Possible values: -1 undetermined
 0 toward zero
 1 to nearest
 2 toward positive infinity
 3 toward negative infinity
Applies to all floating-point types (floatdouble and long double).
FLT_EVAL_METHOD   EVALuation METHOD Properties of the evaluation format. Possible values: -1 undetermined
 0 evaluate just to the range and precision of the type
 1 evaluate float and double as double, and long double as long double.
 2 evaluate all as long double Other negative values indicate an implementation-defined behavior.
Applies to all floating-point types (floatdouble and long double).
DECIMAL_DIG   DECIMAL DIGits Number of decimal digits that can be rounded into a floating-point type and back again to the same decimal digits, without loss in precision.

附中文参考:

FLT_RADIX 用于表述三种浮点数类型的基数(Radix)
DECIMAL_DIG C++11一个可以与 long double 类型互相转化而不会损失精度的十进制数中的数字个数的最大值
FLT_MIN float类型的最小值
DBL_MIN double类型的最小值
LDBL_MIN long double 类型的最小值
FLT_MAX float 类型的最大值
DBL_MAX double类型的最大值
LDBL_MAX long double 类型的最大值
FLT_EPSILON 返回 float 类型的机器精度(Machine epsilon),即 1.0 与下一个可被 float 类型描述的值的差(Difference)
DBL_EPSILON 返回 double 类型的机器精度,即 1.0 与下一个可被 double 类型描述的值的差
LDBL_EPSILON 返回 long double 类型的机器精度,即 1.0 与下一个可被 long double 类型描述的值的差
FLT_DIG 返回在不损失精度的前提下,float 类型可描述的基于基数 10 的数的最大数字(Digit)个数
DBL_DIG 返回在不损失精度的前提下,double 类型可描述的基于基数 10 的数的最大数字个数
LDBL_DIG 返回在不损失精度的前提下,long double 类型可描述的基于基数 10 的数的最大数字个数
FLT_MANT_DIG 返回在不损失精度的前提下,float 类型可描述的基于基数 FLT_RADIX 的数的最大数字个数
DBL_MANT_DIG 返回在不损失精度的前提下,double 类型可描述的基于基数 FLT_RADIX 的数的最大数字个数
LDBL_MANT_DIG 返回在不损失精度的前提下,long double 类型可描述的基于基数 FLT_RADIX 的数的最大数字个数
FLT_MIN_EXP 用 FLT_RADIX 的 x-1 次幂表示 float 类型的规格化(Normalized)时,x 所能取的最小负整数值
DBL_MIN_EXP 用 FLT_RADIX 的 x-1 次幂表示 double 类型的规格化时,x 所能取的最小负整数值
LDBL_MIN_EXP 用 FLT_RADIX 的 x-1 次幂表示 long double 类型的规格化时,x 所能取的最小负整数值
FLT_MIN_10_EXP 用 10 的 x 次幂表示 float 类型的规格化时,x 所能取的最小负整数值
DBL_MIN_10_EXP 用 10 的 x 次幂表示 double 类型的规格化时,x 所能取的最小负整数值
LDBL_MIN_10_EXP 用 10 的 x 次幂表示 long double 类型的规格化时,x 所能取的最小负整数值
FLT_MAX_EXP 用 FLT_RADIX 的 x-1 次幂表示 float 类型的规格化(Normalized)时,x 所能取的最大正整数值
DBL_MAX_EXP 用 FLT_RADIX 的 x-1 次幂表示 double 类型的规格化时,x 所能取的最大正整数值
LDBL_MAX_EXP 用 FLT_RADIX 的 x-1 次幂表示 long double 类型的规格化时,x 所能取的最大正整数值
FLT_MAX_10_EXP 用 10 的 x 次幂表示 float 类型的规格化时,x 所能取的最大正整数值
DBL_MAX_10_EXP 用 10 的 x 次幂表示 double 类型的规格化时,x 所能取的最大正整数值
LDBL_MAX_10_EXP 用 10 的 x 次幂表示 long double 类型的规格化时,x 所能取的最大正整数值
FLT_ROUNDS 默认的浮点数类型的舍入(Rounding)模式
FLT_EVAL_METHOD C++11默认的浮点数类型的反规格化(Denormalization)模式

计算机默认将浮点型常量看做double类型,如果希望为float。则使用后缀f,如果希望long double则使用后缀L(一样大小写任意)。

C++11将使用大括号的初始化称为列表初始化,因为这种初始化常用与给复杂的数据类型提供值列表,它对类型转换的要求更严格。具体的说,列表初始化不允许“缩窄”,即变量的类型可能无法表示赋给它的值(就是我们说的精度损失)。

C++想让强制转换就像函数一样调用,因此允许

typeName(Value);

这样强制转换。

C++认为C语言的强制转换是危险的,便引入了static_cast<>,用法是:

static_cast (Value);

C++11新增了以一个工具,让编译器根据初始值的类型推断变量的类型,为此,它重新定义了auto的含义,使得auto称为不指定变量类型,编译器将把变量的类型设置于初始值相同,在STL中,auto将发挥巨大的作用!

auto i = 1; //i将为int类型
auto d = 1.0; //d将为double类型