1. 类定义可以由于#include的使用而在不同源文件里重复出现,这样并不违反唯一定义规则
2. class的const成员函数不能修改class 成员变量
3. 对于const或者非const对象都可以调用const成员函数,而非const成员函数则只能对非const对象调用 p205
4. 在类X的非const成员函数里,this 的类型就是X*;在类X的const成员函数里 this 的类型就是const X* p206
5. 包含const或引用成员的类不能进行默认构造,必须在构造函数的初始式中进行初始化 p218,222
6. union成员不能有构造函数和析构函数 ?? p218
7. 复制构造函数完成对未初始化的存储区的初始化,复制赋值运算符则必须正确处理一个结构良好的对象。赋值运算符的一般性策略:防止自赋值,删除老元素,初始化,复制新元素。p220
关于string
1. string迭代器不做范围检查。string的下标运算符 [ ] 不进行范围检查,而 at() 则进行范围检查。如果对at()超范围访问,将导致out_of_range 异常。P516
2. 指针和数组的等价关系对 string 不成立,如果s 是 string,&s[0] 和 s 是不一样的 P516
3. string 的 length() 和 size() 是等价的,但是它们不能统计C风格的以0结束的字符串。 P517
4. 许多串操作以字符位置加上字符个数作为参数。如果所给的位置大于串的大小,则会抛出 out_of_range 异常,“过大”的字符计数值则简单地当作取出这个串“剩余”的字符,并不会抛出异常。 P517
5. 不能用单个字符对string 进行初始化,但是可以用单个字符对string 进行赋值。 P519
string s = 'a'; //wrong
string s2;
s2 = 'a'; //OK
6. string 的 data() 产生的是字符数组,而 c_str() 产生的是C风格字符串,即以0作为结束符。string 中可以包含0
字符。即0在 string中并不表示结束标记。?? data() 和 c_str() 产生的字符串存放与缓冲区中,如果要长期使用string的字符串表示,可以通过copy() 函数复制到一个数组中。 P520
char* c_string(const string& s)
{
char* p = new char[s.length()+1];
s.copy(p,s.length());
p[s.length()]=0;
return p;
}