第I部分 C++基础
- cin和cout的箭头方向cin指向变量,输出指向cout
- /*和*/采用就近匹配原则,因此其中间不允许嵌套
- cerr:一个ostream对象,关联到标准错误,通常写入与标准输出相同的设备。默认情况下,写到cerr的数据是不缓冲的。cerr通常用于输出错误信息或其他不属于正常逻辑的输出内容。
- clog 一个ostream对象,关联到标准错误。默认情况下,写到clog的数据是被缓冲的。clog通常用于报告程序的执行信息,存入一个日志文件中。
- C++语言规定一个int至少和一个shor一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。其中,数据类型long long是在C++ 11新定义的。
- 在一个算术表达式中使用布尔变量,则其结果是0或1。
- 不要混用带符号类型与无符号类型,带符号数会自动转化成为无符号数。
- C++规定的转义字符包括
\n换行 \t横向制表符 \a报警(响铃)符 \v纵向制表符 \b退格符 \"双引号 \\ 反斜杠 \?问号 \'单引号 \\反斜杠 \r 回车符 \f进纸符
- 指定字面值类型:
前缀:u 表示unicode 16字符 char16_t,U表示unicode 32字符 char_32_t,L表示宽字符 wchar_t, u8表示UTF-8(仅用于字符串字面常量) char
整型字面后缀:u or U表示unsigned,l or L表示long,ll or LL表示long long
浮点型字面值:f or F 表示float, l or L表示 long double
- 指针声明*和引用声明&都只针对单个变量。对复合指针引用,最简单的办法是从右向左阅读。
int * &r = p;
表示r是对指针p的引用。 - const限定是防止通过该值修改变量。顶层const是针对值本身的限定,底层是针对值指向对象的限定。
- 默认情况下,const仅在文件内有效,例如
const int bufSize = 512;
(类似于宏)。多文件共享需要使用extern。 - 指针类型不匹配会报错,而引用类型不匹配则会自动转化,临时值引用。
int i = 0;
double *p = &i; //错误
double dval = 3.14;
const int &ri = dval; //正确,绑定到了一个转化过的临时量上
- constexpr仅对指针有效,与指针所指对象无关。constexpr把指针对象设置成了顶层指针:
const int *p = nullptr; //p是一个指向整数常量的指针
constexpr int *q = nullptr; //q是一个指向整数的常量指针
- typedef遇到复杂场景,不能直接替换成原来的样子来理解,而是将其对应复杂指针定义为了顶层const指针。
typedef char *pstring;
const pstring cstr = 0; // cstr是指向char的常量指针
const pstring *ps; // ps是一个指针,它的对象是指向char的常量指针。
const char *cstr = 0; // 是对const pstring cstr的错误理解。不能直接替换展开。此处cstr是真想char常量的指针
16 auto在同一条定义语句中必须指向相同的数据类型。auto引用可保留底层const,无法保留顶层const
auto i = 0, *p = &i; //正确
auto sz = 0, pi = 3.14; //错误
auto &h = 42; //不能为非常量引用绑定字面值
- 解引用对象是左值,因此decltype(解引用对象)是引用。decltype表达式如果是双引号,结果也将是引用。
int i = 42, *p = &i;
decltype(r + 0) b; //正确,加法结果是int,因此b是一个未初始化的int
decltype(*p) c; //错误,c是int&,必须初始化
decltype((i)) d; // 错误,d是int&,必须初始化
decltype(i) e; //正确,e是一个未初始化的int
网友评论