十、常量成员函数的含义
1. 若想要修改常量成员,需要添加关键字mutable。
十一、编译器会在类中放东西
1. 在不是确切了解编译器的情况下,不要去管编译器如何处理你的代码,因为那毫无意义。
十二、赋值和初始化并不相同
1. 永远都不应该对一个未初始化的存储区执行用户自定义赋值操作。
十三、复制操作
1. 复制构造函数是去完成对未初始化的存储区的初始化,而赋值操作符则是处理一个已经存在的对象。对一个对象赋值,当它一次出现时,它将调用复制构造函数,以后每次出现,都调用赋值操作符。
十四、函数指针
1. 指向函数的指针,可以用做回调;
2. 一个函数指针指向内联函数是合法的,然而,通过函数指针调用内联函数将不会导致内联式的函数调用,因为编译器通常无法在编译期精确地确定将会调用什么函数。
十五、指向类成员的指针并非指针
1. 指向类成员的指针指向的只是相对于类起始地址的成员的偏移量,+1(以区别空指针);
2. 存在从指向基类成员的指针到指向共有派生类成员的指针的隐式转换,但是不存在从指向派生类成员的指针到指向其任何一个基类成员的指针的转换。
十六、指向成员函数的指针并非指针
1. 指向类成员函数的指针,我们需要将对象的地址用作this指针的值,进行函数调用。
十七、处理函数和数组声明
1. 使用typedef来简化声明。
十八、函数对象
1. 可以使用函数对象来替代函数指针。
十九、Commond模式与好莱坞法则
1. 回调函数为命令模式的实例;
2. 好莱坞法则:不要call我们,我们会call你;
3. 使用函数对象来代替函数指针,同时可以使用组合的方式来进行函数调用,例如QAction的使用方式。
二十、STL函数对象
1. 诸如sort这样的STL泛型算法是以这种方式编写的:函数指针和函数对象都可以用来实例化它们,只要此二者可以采用典型的函数调用语法进行调用即可;
2. 派生自std::binary_function比较器是一个二元函数;
3. 用作STL比较器的函数对象一般都很小巧、简单且快速。当与STL协同使用时,在函数对象中避免使用数据成员的一个原因在于,STL实现可能会为一个函数对象产生若干个复制,而且假定所有这些复制都是一致的,为了确保一个对象的所有复制一致,最简单的方式就是不要让对象带有任何数据成员;
4. 在STL中,函数对象另外一个常见的用途是判断式,可以派生自std::unary_function(是一个一元函数),并使用find_if()进行判断。
二十一、重载和重写并不相同
1. 重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。
2. 重写翻译自override,也翻译成覆盖,是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。
3. 隐藏:隐藏是指派生类的函数屏蔽了与其同名的基类函数。注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。
4. 重载和重写的区别:
1)范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。
2)参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。
3)virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。
5. 隐藏和重写,重载的区别:
1)与重载范围不同:隐藏函数和被隐藏函数在不同类中。
2)参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写。