由于学习过C++高级程序设计语言相关课程,因此在阅读本书时,仅将个人觉得生疏,需要学习的部分摘取出来
1:枚举
枚举成员的默认常值,第一个值为0,后面的以递增的自加、
也可以指定某一个成员的值,从该成员开始值递增
枚举成员值可以是不唯一的
2:预处理器:用指定的头文件的内容替代每个#include
一个头文件可能被多次包含,为了避免名字冲突,需引入一些额外的预处理器设施
#ifndef (变量用全大写字母表示)
#define
#endif
3:左值lvalue可以放在赋值号=的左边和右边
右值rvalue 只能放在赋值号=的右边
库类型都定义了一些配套类型,如string类中的size()函数返回的类型是size_type,它与unsigned型具有相同的含义,而且可以保证足够大能够存储任意string对象的长度
4:标准库string类型,支持长度可变的字符串
5:标准库vector类型,同一种类型的对象的集合,称之为容器,是一个类模板
构造函数:vector<T> v1 vector<T> v2(v1) vector<T> v3(n, i) vector<T> v4(n)
也可以利用数组初始化vector对象,vector<T> ivec(int* p1, int* p2),两个指针p1和p2分别是首元素的地址和最后一个元素之后的地址
优势:可以在运行时高效地添加元素
操作:empty()判断是否为空
size()返回元素个数,类型为size_type
push_back(t)在末尾增加一个值为t的元素
v1[n]提取容器中的元素,下标只能用于获取已经存在的元素
6:迭代器,除了使用下标访问元素外,还可以使用迭代器,迭代器是一种检查容器内元素并遍历元素的数据类型
每种容器类型都定义了自己的迭代器类型,例 vector<int>::iterator iter;
容器的begin和end函数,用于返回迭代器,begin()函数返回指向第一个元素的迭代器,end()函数返回指向vector末端元素的下一个的迭代器,它指向了一个不存在的元素
使用解引用操作符(*操作符)来访问迭代器所指向的元素,且使用自增运算符(++)指向下一个元素,也支持迭代器算术操作
const_iterator类型和iterator类型的区别是,只能用于读取容器内元素,但不能改变元素的值
7:标准库bitset类型
构造函数 bitset<n> b bitset<n> b(u) bitset<n> b(s) bitset<n> b(s, pos, n)
用unsigned值初始化bitset对象,如果bitset类型长度大于unsigned long值的二进制位数,其余的高阶位将置为0
操作:any()是否存在置为1的二进制位
none()是否不存在置为1的二进制位
count() size() test() set() set(pos) reset() reset(pos) flip() flip(pos)
to_ulong()返回一个unsigned long值
动态分配的数组在使用后要释放内存
8:C风格字符串 #include<cstring>必须以结束符null/‘\0'结束,strncpy(s1, s2, n)
strncat(s1, s2, n)
C++标准库类string #include<string> strcat(s1, s2) strcpy(s1, s2)
const char *str = st2.c_str(); c_str()函数将string类对象转化为C风格字符串
尽量使用C++标准库类
9:指向常类型的指针 const int *p1;
常指针 int* const p1;
表达式
1:IO操作符“<< >>”的左结合性
赋值操作符的右结合性,赋值运算符的优先级低于不等操作符
2:前置自增、自减操作符返回加或减1的值
后置的则返回原来的值
3:逗号表达式从左向右计算,结果是其最右边表达式的值
4:强制转换符号
1)旧式 type (expr) (type) expr
2)命名 cast-name<type> (expression)其中cast-name可以是static_cast / dynamic_cast / const_cast / reinterpret_cast之一
type均为目标类型
5:使用预处理器进行调试
#ifndef #endif
四种在调试时非常有用的常量:__FILE__ __LINE__ __TIME__ __DATE__
函数
1:指向指针的引用,例 int* &a;
从右到左理解,a是一个引用,与指向int型对象的指针相关联
2:形参是固定大小的数组
F(int (&arr)[10]) 参数数组的长度为10,括号不能省略
利用模板形参传递指向任意大小的数组的引用形参
template<class T, size_t N>
void array_init(T (&parm)[N]) 在调用时指定N
3:指向函数的指针
bool (*pf)(const string&, const string&); pf为指向函数的指针,它所指向的函数带有两个const string&类型的形参和bool类型的返回值;
用typedef简化函数指针类型的定义:typedef bool(*cmpFcn)(const string&, const string&)这样cmpFcn表示指向返回bool类型并带有两个const strng引用形参的函数的指针类型
标准IO库
1:每个IO类定义了三个iostate类型的常量值,表示特定的位模式
badbit标志着系统级的故障,无法恢复的读写错误;failbit标志着可出现的错误,如在希望获得数值型数据时输入了字符;eofbit是在遇到文件结束符时设置的
流的状态由bad、fail、eof、good操作揭示,bad、fail或者eof中任意一个为true,则流本身将显示该流处于错误状态;如果这三个条件中没有一个为true,则good操作将返回true
clear和setstate操作用于改变条件成员的状态,clear操作将条件重设为有效状态
IO对象的操作:eof() fail() bad() good() clear() clear(flag) setstate(flag) rdstate()
flag为strm::iostate,有strm::badbit, strm::failbit, strm::eofbit
2:输出缓冲区的管理
先将数据存储在于输出流对象有关的缓冲区中,缓冲区在几种情况下会被刷新
1)程序正常结束
2)缓冲区满了
3)操作符显示地刷新缓冲区
4)输入流和输出流关联起来的时候
操作符有flush(不在输出流中添加任何东西)ends(添加null)endl(添加换行)
若程序崩溃了,则不会更新缓冲区
3:读写文件时,则必须定义自己的对象,并将它们绑定在需要的文件上;若需重新和其他文件绑定,则必须先关闭现在的文件,调用close()函数即可
在对文件进行操作之前,需指定文件模式(in/out/app/ate/trunc/binary);模式是文件的属性而不是流的属性