大二的Jingo需要到二校区给学弟们当C\C++程序设计实验课的TA,为了不出现各种XXOO而Jingo解决不了的事情,外加因为一直不按照C++标准去写程序,C\C++特性乱用的Jingo的确想改一下自己写代码的风格习惯,趁着前几周课程不紧,Jingo决定拜读学习一下《C++ Primer 4th Edition》。为了监督自己的学习和备忘,Jingo每天要记下一点学习笔记。
第2章 变量和基本类型
C++的每一种变量规定了最小的存储空间;
可以给unsigned的类型赋值为负数、超过范围的数,需要%256、65536这样的数;
整形中,0开头比如024为八进制(octal),十六进制(hexadecimal)0x或0X开头;
整形字面值后加L、U;
浮点字面值后可加F、L,默认为double; 1024f是不正确的;
转义序列\000(octal)、\xddd(hexadecimal)
多行语句可以在行末加\链接起来;
cou/ t << en/ dl;
标识符不能包含两个连续的下划线,也不能下划线开头后紧跟一个大写字母;
非const引用只能绑定到与该引用同类型的对象;
const引用能绑定到不同类型或者绑定到右值;
double dval=3.14; const int &ri=dval;
非const变量默认为extern,const默认为局部变量;
枚举型示例:
enum Point { point2d = 2, point2w, point3d = 3, point3w };
于是 point2d = 2,point2w = 3, point3d = 3,point3w = 4;
第3章 标准库类型
cin读入string时,读到空白字符,读取终止(空白字符留在输入流中);
getline读入时,遇到换行符终止读入并丢弃换行符;
string::size_type,verctor<int>::size_type不要把size返回给int变量;
string s5 = s4+","+"world";这样ok;
string s6 = "hello"+","+s2;这样不正确;
cctype中的isalum(c)数字或字字母之类的函数;
vector<T> v(n) 默认初始化n个值;
vector(a+2,a+4) 用数组初始化vector;
C++习惯用!=;
改变vector长度之后,不要信赖原有的迭代器;
bitset<32> bitvec("1100") string类型倒序初始化;
bitset<32> bitvec(str,5,4) 第5个开始4个字符;
bitset<32> bitvec(str,str.size()-4) 只用后四位;
site_t 在cstddef中定义的与机器相关的无符号整数;
第4章 数组和指针
void*指针支持操作:
与另一指针比较;
先函数传递void*指针或从函数返回void*指针;
给另一个void*指针赋值;
不允许使用void*指针操纵它所指向的对象;
cstddef中定义了ptrdiff_t这是一种与机器有关的有符号类型;
指针指向数组某个元素后可以 k = p[-2]
const int *p为const指针,是一个自认为指向const变量的指针;
int *const p为指针常量,不可改变指针存储的地址;
定义const int p = 2后,不能让一个非const指针指向p;
typedef string *pstring; const pstring cstr; pstring const cstr; string *const cstr; //以上三种定义形式等价
创建动态数组并用初始值初始化int *pia = new int[10]();
删除一个动态数组 delete [] pia;
char *str = st2.c_str();
int ia[3][4]; int (*ip)[4]; ip = &ia[2]; typedef int int_array[4]; int_array *ip=ia; for (int_array *p = ia; p != ia + 3; ++p) for (int *q = *p; q != *p + 4; ++q) cout << *q << endl;
第5章 表达式
只在有必要时才用后置操作符;
*iter++代表*(iter++)先使用原值解引用,再++,对比(*iter)++和*++iter;
int x[10]; int *p = x; cout << sizeof(x)/sizeof(*x) << endl; //数组长度 cout << sizeof(p)/sizeof(*p) << endl; //与机器有关,返回指针大小/int大小
dynamic_cast用于支持运行时识别指针或引用所指向的对象,目前用途不太明确,mark一下;
const_cast转换const状态;
int a = static_cast<int>(b);
reinterpret_cast将操作数内容解释为另一种不同的类型;
第6章 语句
悬垂else;
异常处理代码中,try\throw\catch的使用先mark一下
预处理宏,assert()是一个宏,现代C++程序很少使用预处理宏。
第7章 函数
尽量用const引用不被修改的形参;
f(int (&arr)[10])传递数组的引用,数组元素个数确定。
f(int (*matrix)[10]) 与 f(int matrix[][10])等价;
#include <iostream> using namespace std; int main(int argc, char* argv[]) { for (int i = 0; i != argc; ++i) { cout << argv[i] << endl; } return 0; }
varargs的用法,先Mark;