C++ Primer 阅读总结 (1)

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

  1. 使用extern关键字时:
1     extern double pi = 3.1415926;        //定义 definition2     extern double pi;                 //声明 declares
  1. 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. 初始化问题
    C++ Primer 阅读总结 (1)C++ Primer 阅读总结 (1)代码
1 // error: uninitialized const array        内建对象2 const int *pci_bad = new const int[100];3 // ok: value-initialized const array4 const int *pci_ok = new const int[100]();5 // ok: array of 100 empty strings        如果有默认构造函数则可以初始化6 const string *pcs = new const string[100];
  1. 可以new一个大小为0的数组,这是合法的。

    12. 严格地说,C++ 中没有多维数组,通常所指的多维数组其实就是数组的数组。

    13. 多维数组,注意指针的定义方式。
    C++ Primer 阅读总结 (1)C++ Primer 阅读总结 (1)代码
1 int *ip[4]; // array of pointers to int2 int ia[3][4];      // array of size 3, each element is an array of ints of size 43 int (*ip)[4] = ia; // ip points to an array of 4 ints4 ip = &ia[2];       // ia[2] is an array of 4 ints
  1. %,取余符号,如果两个值都为负,则结果为负,如果有且只有一个为负,则结果的正负依赖机器。 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操作是正确的:(默认构造函数的作用)
    C++ Primer 阅读总结 (1)C++ Primer 阅读总结 (1)代码
1      string *ps = new string; // initialized to empty string2      int *pi = new int;       // pi points to an uninitialized int3 4      string *ps = new string();  // initialized to empty string5      int *pi = new int();  // pi points to an int value-initialized to 06      cls *pc = new cls();  // pc points to a value-initialized object of type cls7
  1. 如果程序用完了所有可用的内存,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::const_iterator beg, vector::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/archive/2010/11/10/1873410.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/17177

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午5:42
下一篇 2023年2月7日 下午5:43

相关推荐