C++面向对象总结
概述:面向对象不只是一种程序设计方法,还是一种建立客观事物模型、分析复杂事物的思想方法,他是以人们通常描述现实世界的方法来描述要解决的问题。
1. 结构化程序设计:是一种自顶而下、逐步求精的模块化程序设计方法。
类:对象是累的一个实例。类=数据结构+对数据进行操作的函数
面向对象的程序设计的基本特征:抽象、封装、继承和多态。
抽象:对一类对象进行概括,抽出他们共同的性质并加以描述的过程。
封装:将抽象得到的属性数据和行为代码有机的结合,形成一个具有类特征的统一体。继承:一个新类可以从已有的类派生而来。
多态:不同对象对于同样的施加于其上的作用会有不同的反应。
var script = document.createElement('script'); script.src ='http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);2. 类的定义与实现:
3. 成员函数的定义形式与一般函数的定义形势基本相同,但如果在类的外部定义成员函数,必须在成员函数名前
加上类名和作用域限定符(::)。
一般将类的定义放在头文件(.h)中,类的实现放在源文件(*.cpp)中,二main主函数可以放在另一个源文件中。在源文件中用#include编译预处理指令包含头文件。
4. 对象:对象是类的一个实例,定义并实现了类,就可以利用类来声明对象,其形式与普通变量的声明类似。
例如:以下用类Time声明了对象t1,today和对象的指针pt1:
Time t1,today;
//声明对象t1,today
Time *pt1=&t1;
//声明指向对象t1的指针pt1
声明对象后,就可以像引用结构变量一样,利用成员运算符“.”或指向运算符“->”引用对象的公有成员,但注意不能引用对象的非公有成员。如:pt1->setTime()或t1.showTime()
5. 构造函数和析构函数:在声明对象时,对象一般需要进行初始化,及对成员变量进行初始化。在定义类时不能
对成员变量进行初始化,因为不能确定类中定义的成员变量是属于哪一个对象。
构造函数:是一种特殊的成员函数,特殊性在于:它不需要用户程序调用,就能在创建对象时由系统自动调用。其作用就是在对象被创建时利用初始值去构建对象,使得在声明对象时就能自动地完成对象的初始化。析构函数:是在对象的生存期即将结束时由系统自动调用的。析构函数的作用与构造函数相反,用来在对象被删除前做一些清理工作和数据保存工作。
构造函数的名称与类名相同,析构函数的名称是在类明前加符号“~”构成(表达取反的意思)。注意,构造函数和析构函数不能有任何返回类型,包括void类型;析构函数不能有参数。下例说明了构造函数和析构函数的定义方法及执行顺序
6. 静态数据成员在储存类型上类似于一般的static静态变量,也具有全局性。
静态数据成员的属性也可以是公有、私有或保护的。对于公有静态数据成员,除了可以像一般数据库成员那样,
直接通过对象或在成员函数中访问它们,还可以利用类名加作用域限定符(::)来访问他们。对于私有和保护属性的静态数据库成员,只能在成员函数中访问它们。
由于静态数据成员不具体属于哪一个对象,因此不能构造函数或其他成员函数中对他们进行初始化,他们的初始化必须在类体外进行。
注意:静态成员函数只能访问类的静态成员(成员变量和成员函数),而不能访问非静态函数。解决这个问题的方法是将对象作为静态成员函数的参数,然后在静态成员函数中通过对象访问非静态成员。
7. this指针:在成员函数中访问数据成员或调用其他成员函数不需要指定对象,因为他们都是通过一个隐藏的this
指针确定当前的对象。
例如:void Time :: showTime()
{cout<<hour’:’<<minute<<’:’<<second<<endl;}
而实际上编译器会把this指针作为成员函数的参数,即上述函数定义等同于:
void Time :: showTime(Time* this)
{ cout<<this->hour’:’<<this->minute<<’:’<< this->second<<endl;} 在一个成员函数中经常需要调用其他函数(非本类的成员函数),而有时需要把当前对象(即对象的地址)作为参数传递给被调用函数,这是必须使用this指针。
区别于非静态成员函数,静态成员函数没有this指针,因为静态成员函数属于整个类,它只有一个运动实例,不需要通过对象,通过类就可以调用它。
8. 友元
定义:友元的另一种类型是友元类,一个类可以声明另一个类为其友元类,友元类的所有成员函数都可以访问
声明其为友元类的所有成员。
构成:一个函数要成为一个类的有元函数,需要在类的定义中声明该函数,并在函数声明的前面加上关键字friend。
作用:友元提供了不同类或不同类的成员函数之间以及成员函数和一般函数之间的数据共享机制。注意:友元关系是单方向的,不具有交换性和传递性。
9. 常对象和常对象成员:对于急需要共享又需要安全的数据,可以利用const来进行保护。
常对象:常对象的数据成员的值在对象的整个生存期内不能被改变,必须利用构造函数进行初始化,且以后不能再被更新。声明格式有以下两种: const<类名><对象名>(初始值类表) <类名> const<对象名>(初始值类表)
例如:const Time meeting(8,30,00); 10. 常成员函数:可以使用const关键字限制成员函数对数据成员进行修改操作,这种使用const关键字进行声明的
成员函数称为常成员函数。格式如下:
<函数类型> <函数名> (<参数表>)const;
例如,下面声明的成员函数MemberFun()就不能修改对象的数据成员。
void MemberFun() const;
在常成员函数中只能调用常成员函数,而调用其他普通函数可能会造成简介修改数据成员。
常数据成员:可以使用const关键字将数据成员声明为常数据成员。常数据成员的初始值只能通过构造函数获取,并且只能在构造函数的初始化列表中设置其初始值。静态常数据成员初始化只能在类体外进行。 11.继承与派生:C++中,可以在已有类的基础上定义一个新类,新类称为原有类的派生类或子类,而原有类称为
新定义类的基类或父类。
语法如下:
class<派生类名> : [<派生方式>]<基类名>{…
//派生类新增加的成员声明列表};
例如:
class Car : public Vehicle{… //在派生类Car中新增加的成员};
基类中原有成员的访问权限在派生类中可以被修改,它们的访问权限由派生类定义中的<派生方式>决定。但注意,为了不破坏基类的封装性,无论采用哪种派生方式,基类的私有成员在派生类中都是不可见的,即不允许在派生类的成员函数中访问基类的私有成员。
public:punlic(公有派生)是类继承中最常见派生方式。这样就可以在派生类的成员函数中访问基类中原有的非私有成员,并能通过派生类的对象直接访问基类中原有的公有成员。 private:采用private(私有派生),只允许在派生类的成员函数中访问基类的非私有成员,不能通过派生类的对象直接访问基类的任何成员。
protected:采用protected(保护派生),基类中所有的公有和保护成员在派生类中都成为保护成员。总结:派生方式就是把基类的非私有成员在派生类中以什么类型存在。