面向对象
基本概念
- 对象:
- 特征:
- 属性
- 行为
- 类:相同属性和行为对象的抽象
- 方法和消息:
- 实现行为的过程称为方法
- 对象之间的通讯称为消息
- 特征:
- 抽象
- 封装
- 继承
- 多态
类与对象
- 类的定义
-
缺省参数
-
无相应输入时候会引用缺省参数
-
类的成员函数(方法)定义
返回值类型 类名::函数成员名 (参数表){}
-
可以附带默认的形参值(缺省参数)
- 不同类可以拥有同名函数
-
定义于类声明的函数将自动转化为内联函数
-
对象
-
类的实例化
- 说明:
类名 对象名
- 功能
- 给对象一个标识符
- 给对象开辟内存空间
- 将对象中的数据成员初始化
- 同一类下的不同对象使用的函数只占用一个内存块
- 功能
- 引用:
对象名.共有成员数据(方法)
构造函数及析构函数
初始化方式与结构体不同,不能使用{}来进行初始化,因为数据部分是私有的,因此使用构造函数来对对象进行初始化的操作
- 构造函数
- 定义:和类同名的成员函数称为构造函数
- 作用:为对象进行初始化
-
说明:
- 不能指定返回类型
- 类中可以定义多个构造函数(可带或不带参数)
- 没有进行构造函数定义时,编译器会自动建立一个构造函数
- 对象创建时被自动调用
- 可以进行重载操作
-
拷贝构造函数
- 定义:
X::X (X &)
- 作用:创建一个相同的对象
-
说明:
- 对象作为函数参数
- 函数返回一个对象
- 使用函数传参数时,即通过拷贝构造函数传参
-
析构函数
- 定义:与类同名,有前缀
~
- 作用:程序结束时自动清理
- 说明:
- 无返回值
- 不接受任何参数
- 无显式说明时,系统自动生成一个不做任何事的默认析构函数(函数体为空)
静态成员
- 静态属性
- 使用static声明
static int a;
的成员,为所有的对象共有(属于一个类,而不仅仅属于一个对象) - 说明:
- 静态数据成员具有静态生存期
- 用法:
类名::标识符
- 在类的声明中仅仅对静态成员进行引用说明(初始化需要在类外定义)
- 静态方法
- 使用static声明的函数,为所有对象共有
- 说明:
- 静态成员函数可以通过类名或对象名来调用(一般函数仅能使用对象名来调用)
- 静态成员必须通过对象名来访问非静态的数据成员
- 静态成员函数无this指针
this指针
- 每个函数都能通过this指针访问自己的地址
this->成员
,可以在函数内调用对象(或对象里的另一个函数) - 友元函数(类)没有this指针,因为友元函数(类)不是类的成员
- 同样的,也可以定义一个指针指向对象:
* 指针名 = new 类名
友元
- 友元类(函数)可以访问一个类的私有成员
- 声明友元函数:
friend 函数名 (参数表)
- 声明友元类:
friend class 类名
- 声明友元类中的函数:
friend 类名::函数名 (参数表)
继承
-
派生类
-
一个类继承另一个类的属性(父类与子类)
-
class 子类名:继承方式 父类名
-
继承方式: | | public | private | protected | | --------- | --------- | ------- | --------- | | public | public | private | protected | | private | private | private | private | | protected | protected | private | protected |
-
多重继承
-
基类名表大于等于二(基类之间用逗号隔开)
多态
-
一个接口,多个方法
-
两种多态
-
编译时多态性:通过不同的参数类型和参数数目达到多态
-
运行时多态性:虚函数
- 关键字:virtual(在基类中只能使用一次)
#include <iostream> using namespace std; class Base{ public: virtual void virtualfun(void){ cout << "this is base\n"; } }; class Derived:public Base{ public: void virtualfun(void){ cout << "this is derived class\n"; } }; int main(){ Base baseobject; Derived derivedobject; baseobject.virtualfun(); derivedobject.virtualfun(); return 0; }
-
说明
- 虚函数需要更大的开销
- 静态成员函数不能是虚函数
- 虚函数只能是类的成员
- 内联函数不能是虚函数
- 构造函数不能是虚函数
重载
-
函数重载
-
同一个函数名实现不同功能(编译时多态性)
-
操作符重载
-
可重载的运算符:单目运算、双目运算、new、delete、引用运算符
-
声明方式:
函数类型 operator 运算符 (形参表);
#include <iostream> using namespace std; class opre{ public: opre operator ++(void); opre operator ++(int); void display(); opre(); //构造函数 private: int x; }; opre::opre(){ x = 0; } void opre:: display(){ cout << "x = " << x << endl; } opre opre::operator ++(){ opre a; ++x; a.x = x; return a; } opre opre::operator ++(int){ opre a; x++; a.x = x; return a; } int main(){ opre X,Y; X.display(); ++X; Y = ++X; X.display(); Y.display(); return 0; }
模板
-
用来创建一个通用功能的函数
-
形式:
template <typename T>
-
函数定义:
const
- 类中的const成员不能被改变
- 类中的const函数不能改变其他元素的值
- 仅可以通过构造函数或析构函数对const成员进行初始化
- 常见的程序错误:
- 试图修改const对象
- 试图在const成员函数中修改对象的数据成员
- 试图在const成员函数中调用非const成员函数
- 试图通过const对象中调用非const成员函数