(1)P087——原始字符串(Raw String)
例如:cout<<R"( C++ programmers use endl instead of \n )"<<endl;
(2)P094——共用体union
注意:如果union的成员含有string对象,则必须为共用体添加构造函数和析构函数,
否则会出现编译错误。
union One4All
{
One4All() //构造函数不能删除
{
;
}
~One4All() //析构函数不能删除
{
;
}
int intValue;
long longValue;
double doubleValue;
string stringValue;
};
注意:结构体中不可加入构造函数和析构函数,否则会出现编译错误。
struct Widget
{
//Widget(){;}
//~Widget(){;}
int type;
string brand;
};
(3)P105——new和delete必须配对使用,否则将发生内存泄漏。
注意:用new(没有方括号)为数据对象分配内存,应该使用delete(没有方括号)来释放;
用new [] 为数组分配内存,应该使用delete [] 来释放,并且delete时要使指针指向内存起始位置。
举个例子:
double* pDouble = new double[3]; //用new为数组动态分配内存
pDouble[0] = 0.2;
pDouble[1] = 0.4;
pDouble[2] = 0.6;
pDouble += 2;
cout << "After pDouble += 2:" << endl; //现在pDouble指向pDouble[2]
cout << "pDouble[0] = " << pDouble[0] << endl; //0.6
pDouble -= 1;
cout << "After pDouble-=1:" << endl; //现在pDouble指向pDouble[1]
cout << "pDouble[1] = " << pDouble[1] << endl; //0.6
pDouble--; //现在pDouble指向pDouble[0]
cout << "Finally, *pDouble = " << *pDouble << endl; //0.2
delete[] pDouble;
在上面的代码中,如果删除了第11行和第12行,则在执行delete[] pDouble;时,指针pDouble指向的是pDouble[1],而不是pDouble[0]。此时delete,指针没有指向内存起始位置,程序将发生运行错误,可能导致程序崩溃。
(4)P114——strncpy(目标char*, 源char* ,n)
n:要复制的最大字符数。如果目标数组有余,则自动添加\0;
如果目标数组不足,则全部复制过去,不会自动添加\0。
char animal[4]={0};
strncpy(animal,"cat",4); //自动在animal[3]处添加'\0'
strncpy(animal,"tiger",4); //目标数组animal用完,animal[3]为'e'
(5)P120——vector类和array类
创建vector类对象:vector<typeName> vectorObjectName(size);
//动态数组,长度可变,使用new和delete管理内存(free store, heap)
创建array类对象:array<typeName, size> arrayObjectName;
//定长数组,长度不可变,使用栈静态分配内存
(6)P129——以true和false的形式输出布尔变量
cout.setf(ios_base::boolalpha); 或者 cout.setf(ios::boolalpha);
(7)P135——递增/递减运算符和解除引用运算符的优先级
A. 前缀递增、前缀递减和解除引用运算符优先级相同;
B. 后缀递增和后缀递减优先级相同(而且比前缀运算符要高)。
(8)P149——睡眠函数或者挂起函数
A. 加入头文件<windows.h>
Sleep(n):其中n以毫秒为单位。
B. 加入头文件<unistd.h>
sleep(n):其中n以秒为单位。
(9)P149——类型别名typedef
typedef char* charPointer;
typedef int* intPointer;
typedef float* floatPointer;
typedef double* doublePointer;