第二章 C++的重要性
封装:
成员变量(member variable),成员函数(member function)。成员变量通常由成员函数处理。成员变量可以只在类别内被处理,也可以开放给外界处理,为此C++提供private/public/protected修饰词。
把资料声明为private,不允许外界随意存取,只能透过特定的接口来操作,这就是对象导向的封装特性。
继承:
不得不提到this指针:
多态:
相同的指令唤起不同的函数,不得不提到虚函数和虚函数表:点击打开链接
静态成员:
static成员变量不必声明时初始化。
一是static成员变量不属于对象的一部分,二是类别的一部分,所以程序可以在还没有诞生任何对象的时候就处理此种成员变量,但首先你必须初始化它。不要把static成员变量的初始化动作安排在构造函数中,因为构造式可能被调用多次,而变量的初值只能设定一次,同样也不要把初始化动作安排在头文件中,因为它可能被包含多次。应该在类外设定其初值,例如在Main中,或全局函数中,任何函数之外:
double SavingAccout::m_rate=0.0075;
void main(){……}
注意:设定static成员变量初值时,不受任何存取权限的束缚。static成员变量的类型也出现在初值设定语句中,因为这是一个初值设定动作,不是一个数量指定动作,static成员变量是在此时定义的。
取static成员变量:
//第一中方式
void main()
{
SavingAccout::m_rate=0.0075;//欲此行成立,需把m_rate改为public
}
//第二种存取方式
void main()
{
SavingAccoutmyAccount;
myAccout.m_rate=0.0075;//欲此行成立,须把m_rate改为public
}
如果希望在产生任何object之前就存取class的private static成员变量,则必须设计一个static成员函数:
class SavingAccount
{
private:
charm_name[40];
charm_addr[60];
doublem_total;
staticdouble m_rate;
…………………
public:
static voidsetRate(double newPate){m_rate=newRate;}
……………
};
double SavingAccount::m_rate=0.0075;
void main()
{
SavingAccount::setRate(0.0074);//直接调用类别的static成员函数
SavingAccountmyAccount;
myAccount.setRate(0.0074);//通过对象调用static成员函数
}
由于static成员函数不需要借助任何对象,就可以执行,所以编译器不会为其加this指针,因此,static成员函数无法处理类别之中的non-static成员变量。
记住:成员函数之所以能够以单一一份函数码处理各个对象的资料而不紊乱,完全靠的是this指针的指示。
构造函数与析构函数:
C++的new运算符和C的malloc函数都是为了配置内存,两者的主要区别是,new不但配置对象所需的内存空间,还引发了构造函数的执行。
所谓的构造函数:就是对象诞生后第一个执行(并且是自动执行)的函数,它的函数名称必须要与类别名称相同。
所谓的析构函数:就是在对象将要毁灭但未毁灭之前的一刻,最后执行(并且是自动执行)的函数,它的函数名称必须与类别名称相同,再在前面加一个~符号。
对于存在继承关系的类别群,构造函数的执行是从最基础类别至最尾端类别;当对象毁灭之前,析构函数的执行是反其道而行。
三种不同的对象生存方式:
第一种:栈中产生
void MyFunc()
{
CFoofoo;//在栈中产生对象
}
第二种:在堆中产生
void MyFunc()
{
CFoo *pFoo=new CFoo();//在堆中产生对象
}
第三种:全局/静态存储区
CFoofoo;//在任何函数范围之外做此动作
还有:
voidMyFunc()
{
static CFoo foo;//在静态存储区中产生