C++ Primer 5 学习笔记

in with 0 comment

第一部分 C++ 基础

第2章 变量和基本类型

  1. 当赋给无符号类型一个超出范围的值,结果是初始值对无符号类型表示数值总数取模的余数。例如: unsigned char 表示0-255, 赋值结果就是%256的结果。
  2. unsigned + int =>unsigned + (unsigned)int, int如果为-42,转换结果为$2^{32}-42$, 尽量避免混用

    for(unsigned u = 10; u >= 0; --u); // 死循环, u=0, --u => 2^32-1
  3. 转义字符 \1234=> \123 4 两个字符, \x1234 一个字符
  4. 初始化 $\neq$ 赋值(需要擦除原数据), c++11中常用列表初始化:int x = {0}; 这种初始化拒绝精度丢失的操作,比如后者为double型。
  5. 定义在函数内的变量不初始化,函数外的初始化为0。
  6. 分离式编译:extern int x 关键字用于声明, 而不定义(初始化会导致声明变定义)。变量允许多声名。
  7. 命名规范: 变量小写index, 多单词用下划线隔开, 自定义类名首字母大写Sales_item。
  8. 面对复杂的指针/引用类型,采用右向左阅读,如 int* &r = p; 则r是引用,引用一个整形指针变量。int& *r = p 则r是一个指针,指向一个整型引用。int*** r, r是一个指针,指向int**,然后递归理解即可。
  9. const 关键字

    • 初始化无视const关键字
    • const在不同文件中是独立变量,.h中声明extern,.cc中定义extern变量并初始化可以共享。
    • 常量引用: const T& r可以绑定右值(临时量) 和非const对象,过程为右值转为一个临时量const T tmp,然后再引用。
    • 指向常量的指针:const double *cptr = &pi,c从右到左解读为cptr是指针,指向const double类型。这类指针会认为自己指向的是常量,而禁止修改指向的对象。(引用同理)
    • 常量指针:int* const r 从右向左,r为本身const对象, 类型为int*类型, const 用来修饰r本身。(指针本身不能修改,但是可以修改指向的对象的内容)
    • 顶层const: 指针本身是常量; 底层const: 指向的是常量。
  10. 常量表达式用constexpr修饰,constexpr int sz = size()// 当size()是一个constexpr函数时,才正确。
  11. constexpr int *q = nullptr 要怎么理解???
  12. using SI = Sales_item $\Leftrightarrow$ typedef Sales_item SI;
  13. typedef char* pstring;
    const pstring cstr = 0; // const 修饰 pstring, cstr是指向char的常量指针(指针本身不能改)
    const char* cstr = 0; // 理解错误的!!! 从右向左, cstr是指针,指向const char。
    char* const cstr = 0; // 正确!!! cstr本身是const, 是指向char的指针。
  14. auto 关键字

    • 引用赋值给auto, 忽略引用, 显式auto&; auto 会忽略顶层const,需要显式定义const auto
    • *和&不属于auto的一部分。
  15. decltype

    • 希望从表达推断类型,但是不希望用值初始化(不同于auto)。decltype(函数f()/变量k/表达式) x = 0, 则x的类型就是f的返回值类型 / k的类型/表达式计算结果的类型。
    • decltype((val))结果式val的引用
  16. c++11允许提供类内初始值。

第3章 字符串、向量和数组

  1. 头文件不应该using 声明
  2. string s(3, 'c') // ccc char->string可以用
  3. 带等号执行拷贝初始化,不带等号式直接初始化。
  4. auto len = str.size(), len是无符号, len < 负数,可能返回true。
  5. for 遍历用auto& 来改变迭代序列
  6. 泛型编程:for循环中使用!=而不是<=>做条件判断
  7. const_iterator 只读迭代器, 如果对象是常量,只能用const迭代器。(cbegin(), cend())
  8. int ptr[10] ptr数组有10个元素,每个元素是一个指向int的指针; int (ptr) [10]; 遵循从内向外的原则,ptr是指针,再看右边,ptr是指向一个数组大小为10的指针,再看左边,数组类型为int型。连起来就是ptrt是指向大小为10的int型数组的指针。int (&ref)[10], 同理。int& ref[10]不存在。int* (&ref)[10]仍然从内到外,从右到左。
  9. auto ia(数组名), ia为首地址类型。 decltype (数组名) ia2; // ia2为数组类型,不支持ia2=p, p为数组指针。
  10. c++11 int arr[10], begin(arr), end(arr);返回类型int*,效果等同于迭代器。
  11. int *p = a[2]; // p[-2] = a[0];

第二部分 C++ 标准库

第三部分 类设计者的工具

第二部分 高级主题

C++11的特性

Responses