内容
基本内置类型
- 算术类型分为整型和浮点型。基本内置类型包括算数类型和空类型。
- 字符和布尔型属于整型类。
- 最小尺寸表
- 可寻址的最小内存块称为字节。
- 大多数机器1字=8字节=64位(bit)、或1字=4字节=32位(bit)。
- 类型决定了数据所占的比特数,以及该如何解释这些内容。
- int、short、long、long long 都是带符号的,通过在前面添加unsigned可以得到无符号类型,字符型被分为char、signed char和unsigned char,类型char实际上会表现为有符号和无符号其中的一种,取决于编译器。signed char表示-128到127之间的值,unsigned char表示0到255之间的值。
- 执行浮点数运算选double,有些机器双精度比单精度计算快。
- 赋给无符号类型一个超出它范围的值时候,结果等于范围和所赋值取模的余数。
- 赋给有符号类型一个超出它范围的值时候,结果是未定义。
变量
- String是库类型,
std::string book("123");
- 内置类型的变量未被显式初始化,它的值由定义的位置来决定。定义于任何函数体之外的值被初始化为0,反之将不被初始化,访问会引发错误。
- 绝大多数类都支持无须显示初始化而定义对象。
- 类的对象如果没有显式初始化,则其对值由类自己决定。
- 建议初始化每一个内置类型的变量。
- 任何包含了显示初始化的声明即为定义。
- 变量能且只能被定义一次,但可以被多次声明。
- 变量名前添加关键字extern并且不显示初始化为声明。
- 函数体内试图初始化extern标记的变量将引发错误。
- 标识符由字母、数字、下划线组成。
- 不能连续出现两个下划线,不能以下划线紧接大写字母开头,函数体外标识符不能以下划线开头。
- 允许在内层作用域内重新定义外层作用已有的名字。
复合类型
- 引用必须被初始化。
- 引用并非对象,只是给已存在的对象起一个别名。
- 指针本身就是一个对象,可以拷贝和赋值。
- 不能定义指向引用的指针,引用没有实际地址。
int* p = 0;
等价于int* p = NULL;
- NULL是预处理变量。
- 指针和引用的区别:
指针是一个实体,而引用仅是个别名;
引用使用时无需解引用(*),指针需要解引用;
引用只能在定义时被初始化一次,之后不可变;指针可变;
引用没有 const,指针有 const;
引用不能为空,指针可以为空;
“sizeof引用”得到的是所指向的变量(对象专)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
指针和引用的自增(++)运算属意义不一样;
从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
int *&r = p;
从右往左阅读有助于弄清楚它的含义。- 对const修饰的变量引用时也要加Const
- 允许指向常量的指针指向一个非常量的对象。
- 常量指针 *const ,指针的地址不可改变。
- 顶层const是任意对象是常量包括复合类型对象,底层const是指针指向的对象是常量。
- 常量表达式是指值不会改变,并且在编译过程中就能获得计算结果的表达式。
- constexpr指针的初始值必须是nullptr或0或一个存在固定地址的对象。
- 定义于所有函数体之外的变量地址是固定不变的,可以用来初始化constexpr指针。
- constexpr声明中如果定义了一个指针,只对地址有效,对指向的对象无效。所以consterpr int *p 是常量指针。
- 别名声明。
using SI = Sales_Item;
- 类型别名。
typedef double wages;
- auto类型说明符必须有初始值。
- auto 一般会忽略掉顶层const,如果需要就明确指出 const auto f = 。。。;
- decltype会返回函数的返回类型,返回变量的类型(包括引用和顶层const)。变量是引用时候必须初始化,功能类似于加强版auto。decltype(ci) z = …;
- 如果decltype表达式的内容是解引用操作,将得到引用类型。
- decltype表达式内的变量加括号会得到引用类型,不加就是变量的类型。
- 左值右值:
左值lvalue:可被引用的数据对象,例如,变量、数组元素、结构成员、引用和解除引用的指针都是左值。常规变量和const变量都可视为左值,因为可通过地址访问它们。常规变量属于可修改的左值,const变量属于不可修改的左值。
右值rvalue:字面常量(用括号括起来的字符串除外,因为它们表示地址)、包含多项的表达式以及返回值的函数(条件是该函数返回的不是引用)。
- 预处理变量无视C++语言中关于作用域的规则。