1.P5.如果没有在main()末尾写下return语句,这一句会被自动加上。
2.P7.delete是关键字,所以STL删除用的是erase().
3.P8.assignment运算符(=)进行初始化是沿袭C语言风格,C++还有一种称之为”构造函数语法”.
4.P23.数组的大小必须是个常亮表达式或者值。
5.P47.实参是指针,形参是引用,引用是指针的别名,传的实际是指针。
6.P47.常用void display(const & vec)传参,不产生复制,也不会改变值。
7.P47.引用必须初始化,且无法重新指定,指针和引用在自增计算和sizeof计算有区别。
8.P48.函数中的局部对象是暂时存放在堆栈中,当函数执行完毕,该区域的内存就会被弃置,所以不能返回其地址。大多的C++编译器都会对“以传值方式返回的class object”,进行优化,加上额外的reference参数。
9.P50.delete []p数组方式,不能仅仅delete p。
10.P61.指针未初始化会随机指向一块内存,所以一般要初始化NULL,在使用之前也要进行NULL判断。
11.P73.list容器的迭代器一般用!=遍历判断边界,而不是用<这种。List地址不算顺序关系。
12.P78.Vector访问就像播放卡式磁带,List就像播放光盘唱片。
13.P81.List不支持iterator的偏移运算(i++)。
14.P85.标准库中的函数对象(function object)分为算术运算,关系运算,逻辑运算三大类。
15.P92.SET元素默认会按照less-than运算符排序。
16.P102.如果在class主体内定义函数,则这个member function会自动视为inline函数。
17.P103.C++文件扩展名有:.C ,.cc,.cpp,.cxx.
18.P105.Triangular t5();t5会被当做函数。
19.P107.析构函数绝对不会有返回值,也没有任何参数,也不会被重载。
20.P108.C++最难的部分之一,就是何时需要怎样定义destructor函数。
21.P108.下列代码会导致mat被析构,应使用深复制。
{
Matrix mat(4,4);//调用构造函数
{
Matrix mat2 = mat;//调用赋值
//...
}//调用析构函数
}
22.P111.将某具体的类作为返回值的时候,一般要提供两种定义,const版本和non-const版本,如下代码:
class val_class
{
public:
val_class(const BigClass &v):_val(v){}
const BigClass& val() const{return _val};
BigClass& val(){return _val};
private:
BigClass _val;
}
void example(const BigClass *pbc,BigClass &rbc)
{
pbc->val();//调用const版本;
rbc.val();//调用non-const版本;
}
const 函数不能修改数据成员,const class obj不能引用非const 函数成员,可以引用非const数据成员,但不能修改。
23.P112.若将数据成员_next标示为mutable,则对其所做的改变不会破坏class的const性质。
24.P113.this指针:1,只有类存在非静态函数时候才存在;2,只有在非静态成员函数的非静态成员才会自动调用;3,非静态成员函数返回对象本身时,return *this;4,当函数参数名与成员变量同名的时候,this->n = n.
24.P 114.this指针在member function内用来指向其调用者,内部工作过程是,编译器自动将this指针加到每一个额member function的参数列表.
25.P116.member function 只有在不访问任何non-static member的条件下才能被声明为static.
26.P117.在class主体外部进行member function 定义时,无需重复添加关键字static,一般添加可以提示该函数为static函数.
27.P119.前置自增重载:Triangular_iterator& operator++();后置自增重载:Triangular_iterator& operator++(int),编译器自动为后置产生一个int参数(其值为0).
28.P119.friend关键字的一个重要作用:配套写某个类的Iterator 在类的定义中加上typedef Triangular_iterator iterator;
29.P123.友元类不能继承.
30.P131.typedef,可以将一个复杂的声明定一个简单的别名:
typedef void (num_sequence::*PtrType)(int);
PtrType _pmf;//定义一个函数指针
31.P132.
vector<vector<int> > seq;//> >中间有空格,否则会被语义解释为>>运算符.
32.P135.OOP(Object-Oriented-Porgramming)的三大特征:封装,继承(inheritance),多态(polymorphism).
33.P138.member function 的解析都在编译时静态进行.若要令其在运行时解析,则在申明时加上virtual.
34.P139.constructor执行顺序为基类->派生类,在直接desctructor派生类的时候,执行顺序为派生类->基类.但运用多态的时候,即基类指针指向派生类的时候,根据一般原则,凡是基类定义了虚函数,就应该将destructor声明为virtual,若不申明,delete 基类指针,调用析构函数时,只会看指针的数据类型,而不会去看赋值的对象,这样就会造成派生类内存泄露。
35.P142.当派生类的data member与基类的同名时候,会将基类的隐藏,但存在一份,可通过base::data member调用.
36.P146.静态成员函数无法申明virtual,因为其是类相关,无法调用this.
37.P147.基类destructor一般不申明为纯虚函数(无法执行析构),若为纯虚函数,也要定义函数体.
38.P149.派生类重载虚函数的时候,可以不在显示的申明virtual,但加上可以显示的表明它是虚函数.
39.P157.引用永远无法代表空对象,指针却可以是空指针,使用引用就无需检查是否为空了.
40.P159.有纯虚函数的类为抽象类.
41.P159.基类若无构造函数,会自动生成默认构造函数,若显示的提供了非默认构造函数,且无默认构造函数,则派生类的构造函数需要显示的调用基类的构造函数.
42.P160,函数的返回类型无法重载,基类和派生类在虚函数重载的时候返回值必须一致,有个例外,当基类的返回值为某个基类形式的时候.
43.P162.虚函数的静态解析(虚函数失效):1.基类的constructor和destructor内,只会调用本身的;2.使用的是基类的对象,而非指针或引用;3.用类域名指定了,base::.
43.P163.C++的多态性需要一层间接性.唯有用基类的pointer和reference才能支持多态.
44.P164.将派生类赋值给基类,只会将派生类的基类部分传递给基类对象.
45.P173.构造函数使用参数化列表比在函数体中赋值,效率高,后者不产生临时对象.
46.P174.一个类模版的定义:
template <typename elemType>
inline void
BinaryTree<elemType>::
insert(const elemTpye & elem)
{
//...
}
47.P177.申明指针的引用,就可以改变指针的对象,也可以改变指针本身:
void func(int *&p)
{
p = &m_value;//改变指针的内容
// 也可以根据你的需求分配内存
p = new int;
*p = 5;//改变指针所指向的对象的内容
}
48.P181.非类型参数模版
template <int len, int beg_pos = 1>
49.P186.类模版无法基于参数列表的不同而重载.
50.P187.模版函数:非类成员函数的模版函数,普通类的成员函数的模版函数,模版类的成员函数的模版函数.
51.P194.异常处理:try,throw,catch;catch(…)捕获所有异常.
52.P198.面对任何一个被抛出的C++异常,你都可以在程序的某处找到一个相应的throw表达式(有些深藏在标准库中).
53.P199.尽量用对象,在异常处理机制终结某个函数之前,C++保证,函数中的所有局部”对象”的destructor都会被调用.
54.P201.自定义异常继承于标准异常,通过catch(exception)就可以捕获所有异常.
54.P203.string.c_str(),可以将string对象转换为C-style字符串.