C++primer笔记————第二章

C++数据类型
  1. 文字常量是不可寻址的,也就是说它会存在内存的某个地方,但是我们没有办法获取到它的地址。
  2. 在整型文字常量前面加一个0,该值将被解释为一个八进制数,而在前面加上一个0x则会被解释成为一个十六进制数。
  3. 在默认情况下,文字常量被当作为一个int型的有符号值,可以在后面加一个“L”将其指定为long型。
  4. 可以在文字常量后面加一个“U”将其指定为一个无符号数。
  5. 浮点型文字常量默认为double型,可以在后面加“F”或“f”表示为float型。扩展精度由“L”指定,但是这两者只能用在十进制的表示中。
  6. 常见转义字符
    ```
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    7. 字符文字前加“L”,例如 L’a‘  表示宽字符文字,类型为wchar_t,用于例如汉语的某些语言的字符集合。
    8. 字符串文字的类型是常量字符数组,它有字符串文字本身以及编译器加上的表示结束的null字符构成。
    9. 宽字符串文字的类型是常量宽字符的数组。
    10. 如果两个字符串或宽字符串在程序中相邻,C++就会把它们连接在一起,并在最后加上一个空字符。
    11. 使用未定义行为的程序被称作是不可移植的。
    12. 为一个未知的用户组写一个健壮的通用函数,比“实现一个特定的算法来解决眼前的问题”要复杂的多。
    13. 数据类型决定了相关内存的大小、布局、能够存储在该内存区的值的范围以及可以应用其上的操作集。
    14. 当然,我们也可以将变量称为对象,将数据类型想象为类。
    15. 编译器保证对象在使用时的类型正确性。
    16. 对象声明的作用是使程序知道该对象的类型和名字。由关键字extern以及跟在后面的对象类型以及对象的名字构成。
    17. 对象声明不是对象定义,因此不会引起内存的分配。
    18. 一个对象只能定义一次,但是可以有无数次声明。
    19. 变量名必须以字母或者下划线开头。
    20. 如果定义的为全局变量,则系统会保证给它提供初始值0,而如果是局部变量或者说是通过new动态分配的,则系统不会提供初始值。
    21. 一定要养成变量定义之后立即进行初始化。
    22. 每一种内置数据类型都支持一种特殊的构造函数语法,可以将对象初始化为0,例如 int ival=int(); double dval=double(); 。
    23. 对象可以用任意复杂的表达式来初始化,包括函数的返回值。
    24. 指针的典型用法是构建一个链接的数据结构,如树和链表,并管理在内存执行过程中动态分配的对象,以及作为函数参数类型,主要用来传递数组或者大型的类对象。
    25. 指针的类型可以只是编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。
    26. (void*)类型可以被任何数据指针类型的地址值赋值(不包括函数指针)。
    27. 指针算数运算的典型用法是遍历一个数组。
    28. 一般的,我们用指针的算数运算来遍历C风格的字符串,每次指针增加1,直到到达终止空字符为止。
    30. string类型能够自动的将C风格的字符串转换为string对象。
    29. string的赋值操作符,st2=st3; 过程:首先将与st2相关联的字符存储区释放掉,让那后再分配足够存储与st3相关联的字符的存储区,最后将与st3相关联的字符拷贝到该存储区中。
    31. c_str()方法返回一个指向常量数组的指针。
    32. string类型同时也支持通过下标操作访问单个字符。
    33. 关键字const将一个对象转换成了一个常量,它为只读的。
    34. 常量在定义之后就不能进行修改,因此常量在定义时必须进行初始化。
    35. 试图将一个非const对象的指针指向一个常量对象的动作都会引起编译错误。
    36. const对象的地址只能赋值给指向const对象的指针,但是指向const对象的指针可以被赋以一个非const对象的地址(即使该对象非const,也无法通过该指针修改该对象的值)。
    37. 引用又可以称为别名,在实际应用中,引用主要被用作函数的形参,通常将类对象传递给一个函数。
    38. 引用一旦定义必须被初始化,并且一旦定义,就不能再指向其他对象。
    39. 引用的所有操作实际上都是应用在它所指的对象上,包括取地址操作符。
    40. const引用可以用不同类型的对象初始化,也可以是不可寻址的值,例如文字常量。但是同样的初始化对于非const引用是不合法的。
    41. 引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但是用户不能访问它。例如:
    我们写一个 ``` double dval=1024;
    const int &ri=dval;

编译器的实际代码是:int temp=dval; const int &ri=temp;
所以如果我们使用的是非const对象,那么当我们修改ri的值的时候,我们实际上修改的是temp而不是dval。

  1. 指针和引用的两个主要区别:引用必须总是指向一个对象,如果用一个引用给另一个引用赋值,那么改变的是被引用的对象而不是引用本身。
  2. 虽然布尔类型的对象也被看作是一个整数类型的对象,但是它不能被声明为signed,unsigned,short或long.
  3. 当表达式需要一个算数值时,布尔对象和布尔文字都被隐式提升为int,false为0,true为1。
  4. 算术值和指针值也能被隐式转换为布尔类型的值,0或空指针被转换成false,所有其他的值都被转换成true。
  5. 枚举类型中,在默认情况下第一个枚举成员赋值为0,其后成员依次加1。
  6. 非const的变量不能被用来指定数组的维数。
  7. 字符串常量包含一个额外的终止空字符。
  8. 一个数组不能被另一个数组初始化,也不能赋值给另一个数组。
  9. C++不允许声明一个引用数组,即一组引用组成的数组。
  10. 任意结果为整数值的表达式都可以用来索引数组。
  11. C++没有提供编译时刻或者运行时刻的数组下标的范围检查,因此除了程序员自己之外,没有任何方法可以组织数组越界。
  12. 数组标识符代表数组中的一个元素的地址,它的类型是数组元素类型的指针。
  13. vector可以被另一个vector初始化,也可以赋值给另一个vector。
  14. 复数对象有float、double或者long double几种表示。
  15. typedef可以被用作程序文档的辅助说明,也能够降低声明的复杂度,同时也可以增强代码的可读性。
  16. 当一个对象的值可能会在编译器的控制或监测之外被改变时,应该将该对象声明成volatile,因此,编译器执行的某些例行优化行为不能应用在已指定为volatile的对象上。
  17. pair类可以在单个对象内部把两个相同类型或者不同类型的值关联起来。
  18. 重载的操作符依然可以被重载。
  19. 在类体外定义的内联成员函数,应该被包含在含有该类定义的头文件中。
  20. 输入操作符最多读入4095个符号。
  21. setw()读入的字符数最多为给他设定的参数减去1,该函数在头文件iomanip中。
  22. 断言assert是仅在debug版本的程序中起作用的宏,它用于检查“不应该”发生的情况。一旦assert中的参数为false,那么程序就会中断。
  23. 如果一个对象的值可能会在编译器的控制或者监测之外被改变时,那么该对象应该声明成volatile。因此编译器执行的某些例行优化行为不能应用在已经指定为volatile的对象上。
文章目录
  1. 1. C++数据类型
,