第11章C++面向对象编程基础知识11.1面向对象编程(OOP)基本概念11.2类和对象的声明与访问11.3构造函数和析构函数11.4继承性与多态性11.1面向对象编程(OOP)基本概念传统开发方法存在的问题软件重用性差软件可维护性差开发出的软件不能满足用户需要11.1面向对象的基本概念•面向对象的基本概念•对象•对象的状态和行为•类•类的结构•消息和方法•面向对象的特征•唯一性•分类性•继承性•多态性•面向对象的要素•抽象•封装•共享图11-1对象、类、消息传递示意图类的声明的基本语法与结构体的声明类似,一般形式为:class类的名字{public:成员函数或数据成员说明private:数据成员或成员函数的说明}在类的声明中,最重要的关键字是private和public。一个类的所有成员变量和方法默认均为私有(private)。私有成员只能在类本身的方法内访问,而公有成员则可以被该类的所有对象访问。类的访问:用点运算符号(.)来访问该对象的成员。11.2类和对象的声明与访问【例11.1】访问一个简单类的公有成员。#includeiostream.hclassDog//声明Dog类{public://设定public变量intitsAge;//成员变量intitsWeight;//成员变量};//类结构结束标记intmain(){DogPrisky;Prisky.itsAge=6;//设定成员变量的值coutPriskyisadogwhois;coutPrisky.itsAgeyearsold.\n;return0;}程序运行的结果:Priskyisadogwhois6yearsold.【例11.2】实现一个简单的完整类的例程。#includeiostream.hclassDog//开始类声明{public:intGetAge();//声明读取itsAge变量的函数voidSetAge(intage);//声明设定itsAge变量的函数voidWunw();//成员函数private:intitsAge;//定义私有变量};intDog::GetAge()//读取私有变量的函数{returnitsAge;}voidDog::SetAge(intage)//设定私有变量的函数{itsAge=age;}voidDog::Wunw()//定义Wunw方法{cout旺旺旺……\n;}intmain(){DogPrisky;Prisky.SetAge(10);Prisky.Wunw();coutPriskyisadogwhois;coutPrisky.GetAge()yearsold.\n;Prisky.Wunw();return0;}程序运行的结果:旺旺旺……Priskyisadogwhois6yearsold.旺旺旺……11.3构造函数和析构函数•构造函数:在对象被创建时自动调用,对象要进行的所有初始化操作都由构造函数完成。•析构函数:对象不使用时,必须释放空间,以免内存被浪费。当一个对象使用结束时要进行清理工作,对象失效时,析构函数自动调用。需要注意的是:构造函数没有返回值,析构函数不能带参数。【例11.3】使用构造函数和析构函数。#includeiostream.hclassDog{public:Dog(intinitialAge);//声明构造函数~Dog();//定义析构函数intGetAge();voidSetAge(intage);voidWunw();private:intitsAge;};Dog::Dog(intinitialAge)//构造函数{itsAge=initialAge;}Dog::~Dog()//析构函数{}intDog::GetAge(){returnitsAge;}voidDog::SetAge(intage){itsAge=age;}voidDog::Wunw(){cout旺旺旺…...\n;}intmain(){DogPrisky(6);Prisky.Wunw();coutPriskyisadogwhois;coutPrisky.GetAge()yearsold.\n;Prisky.Wunw();Prisky.SetAge(7);coutNowPriskyis;coutPrisky.GetAge()yearsold.\n;return0;}程序运行的结果:旺旺旺……Priskyisadogwhois6yearsold.旺旺旺……NowPriskyis7yearsold.11.4继承性与多态性继承性:是C++的一个非常重要的机制,继承特性可以使一个新类获得其父类的操作和数据结构,程序员只需在新类中增加原有类中没有的成分。交通工具汽车卡车飞机小汽车民航飞机战斗机图11-2一个抽象描述的特性继承表继承派生类的声明一般为:class派生类名:[继承方式]基类名{派生类成员声明};继承方式包括:公有继承(public)、私有继承(private)和保护继承(protected)。多态性:是指同一个接口可以通过多种方法来调用。即可以用一个相同的名字定义不同的函数。【例11.4】使用继承派生类。#includeiostream.henumBREED{GOLDEN,CAIRN,DANDIE,SHETLAND,DOBERMAN,LAB};classMammal{public:Mammal():itsAge(2),itsWeight(5){}~Mammal(){}intGetAge()const{returnitsAge;}voidSetAge(intage){itsAge=age;}intGetWeight()const{returnitsWeight;}voidSetWeight(intweight){itsWeight=weight;}//哺乳动物的方法voidSpeak()const{cout哺乳动物都哺乳!\n;}voidSleep()const{cout哺乳动物睡觉是呼呼的。\n;}protected:intitsAge;intitsWeight;};classDog:publicMammal//从哺乳动物中继承派生出狗的类{public:Dog():itsBreed(GOLDEN){}~Dog(){}BREEDGetBreed()const{returnitsBreed;}voidSetBreed(BREEDbreed){itsBreed=breed;}//狗的其他特殊方法voidWagTail()const{cout摇尾巴...\n;}voidBegForFood()const{cout乞求食物...\n;}private:BREEDitsBreed;};intmain(){Dogfido;fido.Speak();fido.WagTail();coutFido的年龄是fido.GetAge()岁。\n;return0;}程序运行的结果:哺乳动物都哺乳!摇尾巴...Fido的年龄是2岁。【例11.5】使用多态性的函数重载。#includeiostreaminttest(inta,intb);//设定int的test函数floattest(floata,floatb);//设定float的test函数voidmain(){couttest(1,2)endltest(2.1f,3.14f)endl;cin.get();}inttest(inta,intb){returna+b;}floattest(floata,floatb){returna+b;}程序运行的结果:35.24程序中使用了两个名为test的函数来描述int类型的和操作和float类型的和操作,C++内部利用通过参数的类型或个数来内部重命名,这样就方便了程序员对相同或者相似功能函数的管理,这一点和C语言有所不同。