每个类只有一个析构函数和一个赋值函数。可有多个构造函数。
把对象的初始化放在构造函数中,把清除工作放在析构函数中。然后编译器会自动进行初始化和清除工作。
构造函数和析构函数没有返回值类型。
9.2构造函数的初始化列表
位于函数参数表之后,{ }之前,类的const常量只能在初始化列表中初始化,
9.3构造函数的次序
构造从类的最根层调用,首先调用基类的构造函数,然后调用成员对象的构造函数。析构函数与构造函数相反,该次序是惟一的。
注:成员对象初始化的次序只由成员对象在类中的声明次序决定。因为类的声明是唯一的。
9.8如何在派生类中实现类的基本函数。
如果类中存在继承关系:
1.派生类的构造函数应在其初始化列表中调用基类的构造函数。
2.基类和派生类的析构函数应为虚函数(virtual)
3.编写派生类的赋值函数时,注意不要忘记对基类的数据成员进行重新赋值。
10.类的继承和组合
对象是类的实例。
10.1继承
假设A是基类,B是派生类,那么B将继承A的数据和函数。
#include<iostream>
using namespace std;
class A
{
public:
void Func1(void )
{
cout << "func1" << endl;
}
void Func2(void )
{
cout << "func2" << endl;
}
};
class B :public A
{
public:
void Func3(void )
{
cout << "func3" << endl;
}
void Func4(void )
{
cout << "func4" << endl;
}
};
int main()
{
B b;
b.Func1();
b.Func2();
b.Func3();
b.Func4();
system( "pause");
return 0;
}
规则:
1.如果类A和类B毫无相关,不可以为了多了让B一些无相关的功能,就继承A。
2.若在逻辑上B是A的一种,并且A的所有功能和属性对B都有意义,则B继承A 的函数和功能。
10.2组合
若A是B的一部分,则不允许B从A派生。而是应组合。
#include<iostream>
using namespace std;
class Eye
{
public:
void Look(void );
};
class Nose
{
public:
void Smell(void );
};
class Mouth
{
public:
void Eat(void );
};
class Ear
{
public:
void Listen(void );
};
class Head
{
public:
void Look(void ) { m_eye.Look(); }
void Smell(void ) { m_nose.Smell(); }
void Eat(void ) { m_mouth.Eat(); }
void Listen(void ) { m_ear.Listen(); }
private:
Eye m_eye;
Nose m_nose;
Mouth m_mouth;
Ear m_ear;
};
int main()
{
Head h1;
h1.Eat();
h1.Listen();
h1.Look();
h1.Eat();
system( "pause");
return 0;
}
第十一章:
11.1使用const 提高函数的健壮性。
11.1.1使用const修饰函数的参数。
const只能修饰输入参数。
如果输入参数采用指针传递。加const可以防止意外的修改指针。