C++ 离散知识点

摘要

C++ 离散知识点


  • 在不同源文件可define同一个宏(宏作用域为从#define开始到当前源文件结束)
  • 防止头文件重复包含指的是:防止某个源文件重复包含同一个头文件两次,但是同一个头文件可以同时被不同源文件各包含一次。
  • 类一般在头文件中定义,在类内定义的函数默认是内联(inline)的,而在类内声明,在类外定义的函数则不默认为内联(inline)
  • 头文件内定义的变量会自动被加上extern
  • 在头文件里定义函数的几种方法:
    • 声明类,在类中定义静态成员函数,并在头文件中实现函数。
    • 使用模板函数(其要求声明和定义都在头文件中)(没有试过)
    • 定义为内联函数inline

C++ 语法

  • 负数求余和商都是负数。例如-123 / 10 = -12-123 % 10 = -3
  • string类型前要加std::
  • 定义std::string a="123456", 那么a[a.length() - 1] == '6' 而不是'\0'
  • char a = '' 会报错,因为不能初始化为空字符。至少也要是char a = '\0'
  • 注意:栈stack没有reserve方法。(TODO:C++ prime还是算法设计与分析中似乎有总结哪些结构含有reserve,看一下)
  • 注意vector的size是无符号的。例如vector<int> aa;,当aa.size()为0时,aa.size()-1不是-1而是一个无符号数的最大值。在所以建议以后i<aa.size()-1写为i+1<aa.size()
  • C++中,有符号类型数向右位移有点特殊,向右位移时,最左边补0还是补1好像得看机器具体实现。若总是补0则称为logical shift,若补符号位则称为arithmetic shift,目前C++的编译器似乎都是补符号位(即arithmetic shift),例如 10000000 >> 1 结果为11000000。除了这种特殊情况,其他时候位移空缺的位都补0。(leetcode的C++编译器不能对负数右移,不知道为啥,如-1>>1在运行时会报错,参考这里也报错,要把这个弄清楚,否则后序在线笔试时提交代码可能会出错)
  • C++中,有符号数和无符号数在一起进行运算时,首先会将有符号数按照其补码转换为无符号数,再进行运算。(其实可以这么看,机器不认有无符号,全都按照补码来进行计算,最后的结果是补码,按照无符号数的方式解读。)例:
    short a = -1;
    unsigned b = 1;
    if(a < b) printf("a<b");
    else printf("a>b");
    
    结果是"a>b",因为a的补码是全1,被当成无符号数后为65535,那自然大于b。
  • C++变量未初始化的后果。未初始化的全局变量会自动初始化为0,未初始化的局部变量一般为乱码。参考这里。当然我觉得具体情况还得看编译器吧。

C++ 库函数

  • int isalnum ( int c )头文件\<ctype\>,检查一个字符是不是字母或数字(alphanumeric)。
  • int tolower(int c);头文件\<ctype\>,将一个字符转换为小写字符。

相关/参考链接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章