一个良好的用户自定义类型的特征就是它们避免无端地与内置类型不兼容。
重载函数是函数的一种特殊情况,c++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。重载函数常用来实现功能更类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。
函数覆盖发生在父类与子类之间,其函数名、参数类型、返回值类型必须同父类中的相对应被覆盖的函数严格一致,(只有一种情况下返回值可以不一致,那就是返回自己类的引用或者指针的时候)覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时,会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种计指就叫函数覆盖。
将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
当const和non-const成员函数有者实质等价的实现时,令non-const版本调用const版本可避免代码重复。
如果想在const成员函数中对非const对象进行修改,则需要将这些成员变量定义为mutable。
如果成员变量是const或者references时,它们就一定需要初值,不能被赋值。
class的成员变量总是以其声明次序被初始化,即使他们以不同顺序出现在成员初值列。所以,通常成员初值列的成员顺序和它们的声明顺序一样是比较好的。
编译单元是指产出单一目标文件(single
object file)的那些源码。
为避免在对象初始化之前过早地使用它们,需要做三件事。第一,手工初始化内置型non-member对象。第二,使用成员初值列对付对象的所有成分。最后,在"初始化次序不确定性"(这对不同编译单元
所定义的non-local
static对象是一种折磨)氛围下加强你的设计。
请记住:
为内置型对象进行手工初始化,因为c++不保证初始化它们。
构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
为免除"跨编译单元之初始化次序"问题,请以local
static对象替换non-local
static对象。
什么样的构造函数是defalut构造函数?
无实参构造函数。
class Name{
public:
Name(){}
}