默认构造函数:
默认构造函数要么没有参数,要么所有参数都有默认值.在派生类构造函数初始化列表中记得显示调用基类构造函数,否则编译器将会使用基类的默认构造函数,这可能会出现错误.
复制构造函数:
|
|
在按值传递,安置返回对象,编译器生产临时对象,将新对象初始化为一个同类对象的时候,将调用复制构造函数.
赋值运算符:
|
|
用于处理同类对象间的赋值,如果希望处理string类与classname类的赋值可以写成:
析构函数:
当对象过期时,析构函数负责清理工作(如释放内存),对于基类应该提供一个虚析构函数,即使他不需要.
转换构造函数:
|
|
使用一个参数的构造函数他定义了从参数类型到类类型的转换(话说这个中文名跟转换函数就差了两个字,但不一样容易弄混).
|
|
第二/三句话将会调用Star::operator(const Star &)并使用Star(const char)生成一个对象,该对象将作用于赋值运算符函数的参数. 使用转换构造函数时候时建议使用explicit禁止隐式转换*
按值传递对象与传递引用
通常在编写以对象作为参数的函数时,应该按引用,不应该使用按值传递参数,一是为了效率,二是因为在继承使用虚函数时,基类使用引用参数的函数可以接受派生类.
返回对象与返回引用
如果函数返回的是通过引用或指针传递给他的对象,则应该按引用返回对象.返回引用可以节约内存和时间,与按引用传递相似,调用与被调用函数使用同一个对象进行操作.但不总是可以返回引用,比如函数不能返回一个在函数中创建的临时变量的引用,因为当函数结束时临时变量将会消失,这时候应该返回对象.
const
|
|
共有继承要考虑的因素:
is-a关系
is-a为”是一个”的意思,如果派生类不是某种特殊的基类则不要使用,比如从大脑类派生出程序员类.is-a关系的标志之一是:无需进行显示转换即可将积累指针或引用指向或引用派生类对象(向上强制类型转换).反之是可能出现错误的.
赋值运算符
将派生类赋值给基类对象:
|
|
这将转化为: bili.operator=(fuc)他将调用 ZheXue::operator=(const ZheXue &);
那如果将基类赋值给派生类对象呢:
这将转化为fuc.operator=(bili) ; 他将调用 GaoBiLi::operator=(const GaoBiLi &);
然而,派生类引用不能自动引用基类对象.除非我们定义转换构造函数:GaoBiLi(const ZheXue &) ;
转换构造函数可以有一个类型为基类的参数和其他参数,但其他参数必须有默认值:
|
|
这样转换构造函数会根据bili来创建一个临时对象,然后把它作为赋值运算符的参数.
然而还可以直接写个参数为ZheXue的赋值运算符函数….:
|
|
私有成员与保护成员
对于外界来说,只能用共有成员来访问二者,对于派生类来说,可以直接访问基类的保护成员,而私有成员仍要通过基类的成员函数来访问.
虚方法
如果要在派生类中重定义基类的方法则应该使用virtual.
析构函数
基类的析构函数应当是虚的.这样在使用指针或者引用删除派生对象时,程序会先调用派生类的析构函数然后调用基类的,而不会只调用基类的析构函数
友元函数
友元函数并非类成员因此不能继承,如果希望派生类函数能使用基类的友元函数,可以使派生类指针或引用强制转换为基类的指针或引用,然后使用转换后的指针或引用来调用友元函数.
|
|