第四章:类与对象
一、什么是面向对象
将过程抽象为对象。
以抽象化思维去解决问题。
要求:高度概括、分类、抽象。
C++的三大特性:继承、封装、多态。
抽象:
数据抽象:描述某类对象的属性或状态。(private)
行为抽象(代码抽象、功能抽象):描述某类对象的共有的行为特征或具有的功能。
实现:通过类的声明。
封装:
将抽象出的数据成员、函数成员相结合,形成类。
继承:
欢欢,还记得继承是什么嘛?
忘了就去看我的笔记。
多态:
同一名称,不同的功能实现方式。
还记得嘛,欢欢?
二、类
类是具有相同属性和行为的一组对象的集合。
类内部包括属性和行为两个主要部分。
欢欢,还记得我跟你强调过的:类就是一种咱们自己定义的数据类型,与系统的int、double、float等等都一样,同样的也可以将int那些类型理解成类。
类的声明形式:
在考试时,肯定涉及大量的类的设计与编写,一定要注意。
公有类型成员:
在关键字public后面声明的数据成员或函数成员。
它们通常是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。
私有类型成员:
在关键字private后面声明。
只允许本类中的函数访问,而类外部的任何函数都不能访问。
tips:如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。
如:
class Love
{
string name="lyx";
string time="forever";
public:
void tell();
}
上面的name和time就相当于private类型成员。
保护类型成员:
在关键字protected后面声明。
与private类似,其差别表现在继承与派生时对派生类的影响不同。
成员数据:
与一般的变量声明相同,但需要将它放在类的声明体中。
成员函数:
在类中说明原型
可以在类外给出函数体实现,并在函数名前使用类名加以限定。
三、对象:
什么是对象:
对象就是类的实例化。
相当于变量。
如
int a=1;
Point p1(1,2);
创建形式与创建变量类似。
因为,类是一种我们自己书写的数据类型嘛,对吧。
对象所占据的内存空间,仅用于存放数据成员!
函数成员不在每个对象中存储副本,每个类函数的代码在内存中只有一份。
成员的访问方式:
类中成员互访:直接使用成员名
对象成员的访问:使用对象名.成员名方式访问public属性的成员。
四、构造函数与析构函数:
构造函数:
作用:在对象被创建时,为对象进行初始化,也就是为属性进行初始化赋值。
构造函数有无参、有参、复制三类构造函数。
复制构造函数:
类名 (类名 &对象名);
Clock(Clock& c1); //复制构造函数
三种情况:
(1)当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现复制赋值
(2)若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用复制构造函数。
(3)当函数的返回值是类对象时,系统自动调用复制构造函数。
析构函数:
清理内存,回收资源,销毁对象。
说白了就是善后工作。
一般而言系统会自动调用对象所属的类的构造函数。
且构造函数一般不需要我们去进行书写,咱们一般只需要刷存在感。
但当涉及动态内存分配时,需要手动进行书写。
~类名();
~Clock(); //析构函数
五、类的组合:
欢欢,你看啊,类是一种特殊的数据类型对吧。
再看咱们的一般变量,我们是不是可以把变量作为参数去传入函数进行调用呢》?
那么,对象是不是也可以作为参数去传给函数呢?
当然可以!
class Rational
{
public:
Rational();
Rational(int newNumerator, int newDenominator);
~Rational();
void add(Rational r); //类的组合
void sub(Rational r); //类的组合
void multiple(Rational r); //类的组合
void divide(Rational r); //类的组合
bool equal(Rational r); //类的组合
void display();
private:
int numerator; //分子
int denominator; //分母
void optimization();
};
class Line
{
public:
Line(Point xp1, Point xp2); //以对象作为参数
Line(Line& l);
double getLen();
private:
Point p1; //以另外一个类的对象作为属性
Point p2;
double Len; //长度
};
六、UML:
七、实例:
Point类:
#pragma once
#include<iostream>
using namespace std;
class Point
{
public:
Point(int xx=0, int yy=0);
Point(Point& p);
int getX();
int getY();
private:
int x;
int y;
};
Point::Point(int xx, int yy)
{
this->x = xx;
this->y = yy;
}
Point::Point(Point& p)
{
this->x = p.x;
this->y = p.y;
}
int Point::getX()
{
return this->x;
}
int Point::getY()
{
return this->y;
}
Line类:
#pragma once
#include"Point.h"
class Point; //前向引用声明
class Line
{
public:
Line(Point xp1, Point xp2);
Line(Line& l);
double getLen();
private:
Point p1;
Point p2;
double Len; //长度
};
Line::Line(Point xp1, Point xp2):p1(xp1),p2(xp2)
{
cout << "构造" << endl;
double x = double(p1.getX() - p2.getX());
double y = double(p1.getY() - p2.getY());
this->Len = sqrt(x * x + y * y);
}
Line::Line(Line& l)
{
this->p1 = l.p1;
this->p2 = l.p2;
this->Len = l.Len;
}
double Line::getLen()
{
return Len;
}
理解上述例子
double x = double(p1.getX() - p2.getX());
double y = double(p1.getY() - p2.getY());
this->Len = sqrt(x * x + y * y);
}
Line::Line(Line& l)
{
this->p1 = l.p1;
this->p2 = l.p2;
this->Len = l.Len;
}
double Line::getLen()
{
return Len;
}
<font color=brown size=8>理解上述例子</font>
![立夏](https://img-blog.csdnimg.cn/img_convert/e899ef9803e55354bfd848809df7a321.png)