C/C++语法总结

C/C++语法总结

读《C++ Primer(第5版)》,一些记录

心得①:从右向左、从内向外阅读变量(刨去基本变量类型),如:
int *&r = ptr;// 右向左:r是引用->指针的引用->指向int型指针的引用(p53)
int *const curErr = &errNumb;// 右向左:常量,指针,即curErr为常量指针,curErr不变(p56)
const double *cptr = π// 右向左:指针,常量,即cptr为指针常量,*cptr不变
int *ptrs[10];// 右向左:首先是个数组,数组内容为指针
int (*Parray)[10];// 内向外:首先是个指针,指针内容为数组
int *(&arry)[10] = ptrs;// 内向外、右向左:首先是个引用,引用内容为数组,数组内容为指针

心得②:const作为限定符独立于数据类型和声明符,换言之const很独立,因此:
auto只可替换数据类型和底层const(p62)
decltype则完整包含所有const和数据类型

  1. char类型(p32)
    c++中char类型被分为三类:char、signed char、unsigned char,其中char不一定等价于signed char(取决于编译器)
  2. unsigned 与 signed 数运算,结果为 unsigned
    例: unsigned u = 10;
    int i = -42;
    std::cout << u + i << std::endl;
    结果:不是-32,而是4294967264
  3. 注意的变量作用域(p43-44)
    如 for(int val = 1; val <= 10; ++val)
    sum +=val;
    这里的val,出了for循环就不在作用域内了
  4. 定义多个变量时,注意数据类型和类型修饰符(*和&)的位置
    如:int* p1, p2; // 注意,这里只p1是指针,p2则是int
  5. 常量的共享(p54)
    若想在多个文件之间共享同一个常量,必须在其声明和定义时都加extern,如
    // file_1.cc 定义并初始化一个常量
    extern const int bufSize = fcn();
    // file_1.h
    extern const int bufSize;
  6. 常量引用(指向const的引用)有可能绑定的是一个临时量对象(p55),因此常量引用引用的可能不是一个常量(p56)
    不同于一般的引用,常量引用可以绑定非常量的对象、字面值甚至一般表达式,如
    int i = 42;
    const int &r1 = i; // 绑定一般int对象
    const int &r2 = 42; // 正确
    const int &r3 = r1 * 2; // 正确
    另外,指向常量的指针所指的对象也可能不是一个常量(p56),如
    double dval = 3.14;
    const double &cptr = &dval;// 正确,但不能通过cptr改变dval的值
  7. typedef不能作为简单的类型替换(p61)注意注意注意注意注意注意注意注意注意注意
    如:
    typedef char *pstring;
    const pstring cstr = 0;// 这里等价为 char * const cstr = 0; 而非 const char *cstr = 0;
  8. 如果表达式的内容为解引用操作,则decltype将得到引用类型(p63),如
    int i = 42, *p = &i;
    decltype(*p) c; // 错误:c是引用类型,必须初始化
  9. decltype((variable))的结果永远是引用(p63)
  10. string的+运算(p81)
    string s2 = “world”;
    string s7 = “hello” + “,” + s2;// 错误,这里由于计算顺序,”hello” + “,” 先运算,但string的+运算必须保证其中一个加数为string类型 // 字符串字面值不是string类型
  11. vector初始化(p89)
    vector v7{10};// 这个等价于vector v7(10);// 这是由于10非string类型,所以这里就成了10个元素了
  12. 字符数组使用字符串初始化,需要注意结尾的’\0’(p102)
    如:
    char a3[] = “c++”; // a3维度为4,即等价于 char a3[] = {‘c’,’+’,’+’,’\0’};
  13. 类的operator new
    一般格式如 void* classA::operator new(size_t size, mytype_t haha, …);
    这里size为编译器指定,在调用时不需要手动指定,如
    new(25) classA(…);
    25会赋值给haha而非size

你可能感兴趣的:(C/C++语法总结)