C++ Primer 阅读总结 (1)

之前被人面C++鄙视了,所以决心学习一下C++相关的东西,买了C++ Primer来读,顺便摘抄一些读书笔记。第一部分基础知识的分享出来~因为大部分是给我自己看的,所以可能有些比较小白的知识点或者不知所以的话,读者见谅。

1. 使用extern关键字时:

1 extern double pi = 3.1415926; //定义 definition
2 extern double pi; //声明 declares

2. Const Object are local to a file by default. 一个const变量如果想要被其他文件引用的话需要加extern声明,而普通变量是默认extern的。
3. 对于引用的赋值其实是对于引用所指的变量进行的赋值,引用只是起一个别名的作用。
4. Struct 和 class 的区别是默认访问性的问题,前者默认是public的,后者默认是private的。
5. bitset, string 对象的最右边字符(即下标最大的那个字符)用来初始化 bitset 对象的低阶位(即下标为 0 的位)。
6. 字符数组使用字符串初始化的时候会自动添加null的结尾符。 比如: char ca[] = "c++";  ca的长度为4。
7. 在函数体外定义的内置数组,其元素均初始化为 0。
    在函数体内定义的内置数组,其元素无初始化。
    不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,
    则必须为该数组的元素提供显式初始化。
8. 指针记得从右往左读就可以理解其含义。
    typedef string *pstring;    const pstring cstr;    //等价于 string *congt cstr;
    typedef并不是单纯的文字取代。
9. 在使用C-Style Strings的函数时,使用strn形式的函数。
10. 初始化问题

代码
1 // error: uninitialized const array 内建对象
2 const int *pci_bad = new const int[100];
3 // ok: value-initialized const array
4 const int *pci_ok = new const int[100]();
5 // ok: array of 100 empty strings 如果有默认构造函数则可以初始化
6 const string *pcs = new const string[100];

11. 可以new一个大小为0的数组,这是合法的。
12. 严格地说,C++ 中没有多维数组,通常所指的多维数组其实就是数组的数组。
13. 多维数组,注意指针的定义方式。   

代码
1 int *ip[4]; // array of pointers to int
2 int ia[3][4]; // array of size 3, each element is an array of ints of size 4
3 int (*ip)[4] = ia; // ip points to an array of 4 ints
4 ip = &ia[2]; // ia[2] is an array of 4 ints

14. %,取余符号,如果两个值都为负,则结果为负,如果有且只有一个为负,则结果的正负依赖机器。    VS2010试验:21%-5=1,而非-4,另外 -21%5=-1。
15. 移位操作符具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高。    cout << 10 < 42;   // error: attempt to compare cout to 42!
16. C++中的建议:除非必要,一般使用前置的自增或自减符,因为 ++i 比 i++ 需要更少的操作,后者需要保存一份原数值以供返回。
17. 如下的new操作是正确的:(默认构造函数的作用)

代码
1 string *ps = new string; // initialized to empty string
2 int *pi = new int; // pi points to an uninitialized int
3
4 string *ps = new string(); // initialized to empty string
5 int *pi = new int(); // pi points to an int value-initialized to 0
6 cls *pc = new cls(); // pc points to a value-initialized object of type cls
7

18. 如果程序用完了所有可用的内存,new 表达式就有可能失败。如果 new 表达式无法获取需要的内存空间,系统将抛出名为 bad_alloc 的异常。
19. C++ 保证:删除 0 值的指针是安全的。    一旦删除了指针所指向的对象,立即将指针置为 0,这样就非常清楚地表明指针不再指向任何对象。否则垂直指针(dangling pointer)比较危险。
20. 整型提升是标准类型转换规则的子集,它将较小的整型转换为最接近的较大数据类型。        3.14159L + 'a'; // promote 'a' to int, then convert to long double
21. 在使用数组时,大多数情况下数组都会自动转换为指向第一个元素的指针,不将数组转换为指针的例外情况有:数组用作取地址(&)操作符的操作数或 sizeof 操作符的操作数时,或用数组对数组的引用进行初始化时,不会将数组转换为指针。
22. 强制类型转换,四种:static_cast、dynamic_cast、const_cast 和 reinterpret_cast。Only a const_cast can be used to cast away constness.   
  char *pc = (char*) ip;  效果与使用 reinterpret_cast 符号相同,但是是在尝试使用static_cast和const_cast进行转换无效后才会使用reinterpret_cast进行转换。
23. 不会被改变的引用参数应当声明为const。    比如,string::size_type fine_char(string &s, char c) 函数就不能够被这样调用:find_char("Hello world!", 'o');
24. int *&tmp;    //是一个对指向了int类型的指针的引用。依然从右往左读——一个引用,引用了一个指针,指向了int型。
25. C++中,函数应当避免传递Vector对象作为参数,而是选择使用传递iterators。

  比如  void print(vector<int>::const_iterator beg, vector<int>::const_iterator end){ /* ... */}
26. void printValues(const int ia[10])  形参的长度会引起误解,如果传入的参数不是长度为10的话就可能导致运行时错误。而通过引用书传递数组则是可行的:

  void printValues(int (&arr)[10]) { /* ... */ },能够保证数组的长度为10。
27. const函数:const在函数体之前,函数的参数列表之后。 const对象只能调用该对象的const方法。
28. 当形参以副本传递时,不能基于形参是否为 const 来实现重载。因此不能基于指针本身是否为 const 来实现函数的重载。仅当形参是引用或指针时,形参是否为 const 才有影响。
29. 只有支持拷贝的元素类型才能够存储在vectors等容器类型中,因为stream对象不支持copy,因此无法存储在这样的容器类型中。传递参数也是如此,只能通过引用或指针传递stream参数或返回值。

原文地址:https://www.cnblogs.com/funnydavid/p/1873410.html