zoukankan      html  css  js  c++  java
  • 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参数或返回值。

  • 相关阅读:
    判断回文字符串
    汉诺塔递归问提
    课程作业02.2
    编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。
    《大道至简》第一章java伪代码分析
    《大道至简》读后感
    用户体验
    大二上学期软件工程概论学习进度表(第十五周)
    12-24个人博客
    大二上学期软件工程概论学习进度表(第十四周)
  • 原文地址:https://www.cnblogs.com/funnydavid/p/1873410.html
Copyright © 2011-2022 走看看