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