基本内置类型
long是32位的长整型,long long是64位的长整型,其是C++ 11新定义的。
除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的和无符号的两种。
其中char和signed char并不一样。尽管字符型有3种,但是字符的表现形式却只有2种:带符号的和无符号的。类型char实际上会表现为上述两种形式的哪一种,具体由编译器决定。
选择类型时的注意事项:
(1)如果你的数值超过了int的范围,可选用long long。
(2)在算术表达式中不要使用char或bool,只有存放字符或布尔值时才使用它们。
(3)如果你需要使用一个不大的整数,那么明确指定它的类型是signed char或unsigned char。
(4)执行浮点数运算选用double,long double提供的精度在一般情况下是没有必要的,况且它带来的运行时消耗也不容忽视。
类型转换:
(1)当把一个浮点数赋给整数类型时,进行了近似处理。结果值将仅保留浮点数中小数点之前的部分。
(2)当把一个整数值赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。
(3)当赋给无符号类型一个超出其表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。
我们可以将整型字面值写作十进制数、八进制数或十六进制数的形式。以0开头的整数代表八进制数,以0x或0X开头的代表十六进制数。
由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串。
在C++中,初始化和赋值是两个完全不同的操作。
有4种语句可以实现变量初始化:
int units = 0;
int units = {0};
int units{0};
int units(0);
作为C++ 11新标准的一部分,用花括号来初始化变量得到了全面应用,因此优先使用第3种方式进行初始化。当需要使用多个相同的值进行初始化容器时,推荐使用第4种方式进行初始化。
为了支持分离式编译,C++语言将声明和定义区分开来。声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。而定义负责创建与名字关联的实体。
如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式初始化变量。任何包含了显式初始化的声明即成为定义。
和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。
指针的值(即地址)应属于下列4种状态之一:
(1)指向一个对象
(2)指向紧邻对象所占空间的下一个位置
(3)空指针,意味着指针没有指向任何对象
(4)无效指针,也就是上述情况之外的其他值
得到空指针最直接的办法就是用字面值nullptr来初始化指针。
建议初始化所有的指针,并且在可能的情况下,尽量等定义了对象之后再定义指向它的指针。
void是一种特殊的指针类型,可用于存放任意对象的地址。
**利用void指针能做的事比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void*指针**。
默认状态下const对象仅在文件内有效。如果想让const对象只在一个文件中定义const,而在其他多个文件中声明并使用它。解决的办法是,对于const变量不管是生命还是定义都添加extern关键字,这样只需定义一次就够了。
常量表达式const expression是指值不会改变并且在编译过程就能得到计算结果的表达式。C++ 11新规定允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int size = size(); // 只有当size是一个constexpr函数时才能正确编译
新标准允许定义一种特殊的constexpr函数,这种函数应该足够简单以使得编译时就可以计算其结果,这样就能用constexpr函数去初始化constexpr变量了。
在数据类型中,算术类型、引用和指针都属于字面值类型,都可以使用constexpr定义。而自定义的类、IO库、string类型不属于字面值类型,也就不能被定义为constexpr。
一个constexpr指针的初始值必须是nullptr或者是0,或者是存储于某个固定地址中的对象。
在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。constexpr指针既可以指向常量也可以指向一个非常量。
原有的定义类型别名的方法是使用typedef,新标准推荐使用using别名声明:
using SI = Sales_item; // SI是Sales_item的同义词
编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。
auto在自动推断const常量时,会自动去除const属性。如果希望推断出的auto类型是一个const类型,需要手动指定:
const auto f = ci;
C++ 11引入了第2种类型说明符decltype,它的作用是选择并返回操作数的数据类型。如果decltype使用的表达式是常量,则decltype返回该变量的类型也包含const:
const int ci = 0;
decltype(ci) x = 0;
decltype((variable))(注意是双层括号)的结果永远是引用。
头文件通常包含那些只能被定义一次的实体,如类、const和constexpr变量。
C++的头文件保护定义与C的略有不同,其#ifndef的宏最外两侧没有_,如文件名为sales_data.h的头文件:
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
#endif