C++学习笔记2——易混淆概念及易忽略知识点

  1. main函数返回值必须为int类型,0表示成功,非0返回值通常对应错误类型。
  2. 输入输出流”中‘’的概念:随着时间推移,字符是顺序生成或消耗的。
  3. 标准库中的iostream库中的ostream类型还定义了cerrclog对象,前者用来输出警告和错误消息,后者输出程序运行时一般信息。
  4. 类型的含义:不仅定义了数据元素的内容,也定义了这类数据所能进行的运算。
  5. 对象的含义:具有某种数据类型的内存空间。
  6. 文件结束符:比如停止cin对象从键盘读入数据。在Win系统中,敲Ctrl+Z,然后按Enter;在Unix系统中,敲Ctrl+D
  7. 正确的编码习惯:按照编译错误报告的顺序逐个修正错误并且,每修正一小部分错误就立即重新编译代码,即所谓的“编辑-编译-调试”周期,这样可以避免单个错误的向后传递效应。
  8. 类(class)也是一种类型。
  9. 带符号类型和无符号类型不能混用,比如:
    unsigned u = 10;
    int i = 42;
    cout<< u - i <<endl;
    如果机器上int占位是32位的话,那么u-i的运算过程是:首先i转换成无符号类型,运算结果是-32,但由于含无符号类型的表达式运算结果不会小于0,于是 2**32-32 = 4294967264 ,类比可知:如果u-i运算结果是-1,那最终结果就是 2**32-1=4294967295 。这对Python这种弱类型语言学习者来说是很奇怪的,不过值得注意。
  10. 列表初始化形式:
    int a = 0;
    int a = {0};
    int a{0};
    int a(0);
    C++11标准以上四种初始化语句都是正确的,而利用{}初始化的一个重要特点是,如果初始值存在丢失信息的风险,编译器将报错,比如
    int a = { 2.141414 };
    cout << a << endl;
    结果会是:error C2397: 从“double”转换到“int”需要收缩转换。从某种角度来说,合理利用这个列表初始化可以使得代码更加健全。
  11. 引用的初始值必须是个对象,且引用的类型必须与初始值类型保持一致,注意:引用本身并非一个对象!
  12. 指针存放的是某个对象的地址,所以赋值时需要在初始值对象前加上取地址符&,指针类型必须和初始值对象类型保持一致。
    int i = 1;
    int *p =&i;
    cout << *p << endl;
    即*p的值为1,p的值为i对象的地址,注意!
    int arry[5] = { 1,3,5,7,9 };
    int *p = arry;
    std::cout << *p+1 << std::endl;
    std::cout << *(p+1) << std::endl;
    结果分别是2,3,因为p指向的是数组的第一个元素的地址,分别是内容加一和地址加一。
  13. 符号的多重含义
    int i = 42;
    int &r = i;    // &紧随类型名出现,因此是声明的一部分,r是一个引用
    int *p;        // *紧随类型名出现,因此是声明的一部分,p是一个指针
    p = &i;        // &出现在表达式中,是一个取地址符
    *p = i;        // *出现在表达式中,是一个解引用符,即指针p存放的地址对应的那个对象现在被赋值为i
    int &r2 = *p;  // 将指针p存放的地址对应的对象绑定给引用r2
  14. void类型的指针可以存放任意对象的地址,然而却无法直接操作所指对象,因为无法确定对象类型。
  15. const限定符:将对象的类型限定为常量,其值不能改变。因为指针也是对象,所以将常量指针称作顶层const、指向常量的指针称为底层const,前者的地址是不能改变。
  16. decltype类型提示符:选择并返回variable的数据类型,注意:decltype((variable)) 即双层括号时,结果永远是引用类型。
  17. using声明using指示
  • 前者最安全,表示方法类似 using std::cin; 就可以在代码中直接使用 cin,而不需要显式的写 std::cin了,需要注意的是每个名字都需要独立的using声明,所以相对来说比较繁琐;
  • 后者方便但可能会带来比如二义性这种错误,表示方法类似 using namespace std; 这样就可以直接使用标准库下std命名空间中的所有名字了,如 cin, cout 需要注意的是,using指示不能出现在类作用域中

猜你喜欢

转载自blog.csdn.net/qq_35221523/article/details/79474338