文章目录
前言
一、类与对象初识
1、什么是面向过程与面向对象,以及它们的优缺点分别是什么
面向过程
步骤化:是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象
行为化:面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为
优缺点
面向过程:
- 优点:性能上它是优于面向对象的,因为类在调用的时候需要实例化,开销过大。
- 缺点:不易维护、复用、扩展
面向对象:
- 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出__低耦合__的系统,使系统更加灵活、更加易于维护
- 缺点:性能比面向过程低
2、类与对象
类
即类别:类是具有相似属性和行为的一组实例集合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RggEuxvD-1660054840939)(类和对象初识.assets/1657191123507.png)]
-
属性 ---->数据成员: int, float, char,string ,double ,struct ,class
-
行为 ---->成员函数: 类中的函数
对象
- 对象,即类的实例:现实世界是由各种各样的事物组成,包括真实的事物和抽象的事物。例如,人、动物、汽车(真实的事物)和程序、直线(抽象的事物)等。
- 每一类事物都有自己特定的属性(如大小、形状、重量等)和行为(如生长、行走、转弯、运算等),人们通过研究事物的属性和行为而认识事物。在计算机科学中将这些现实世界中的事物称之为对象
对象: 类具体化(实例化)
例子: 女朋友类
属性:姓名 年龄 身份证 三围… 未初始化的变量
行为: 购物,睡觉 ,吃饭
对象:姓名: 小芳 年龄18 身份证:xxx 三围 x,y,z 变量被初始化
I、面向对象的三大特征
面向对象三大特性
抽象(一般忽略这个)
抽象是人类认识问题的最基本手段之一。抽象是指对具体问题(对象)进行概括,抽出一类对象的公共属性和行为并加以描述的过程。类是对象的抽象,对象是类的特例。
封装
封装是把每个对象的数据(属性)和操作(行为)包装在一个类中。一旦定义了对象的属性和行为,则必须决定哪些属性和行为只用于表示内部状态,哪些属性和行为在外部是可见的。 封装保证了模块具有较好的独立性,使得程序维护修改较为容易。
继承
继承是指一个新类可以从现有的类派生而来。新类继承了现有类的特性,包括一些属性和行为,并且可以修改或增加新的属性和行为,使之适合具体的需要。继承为了重用父类代码,同时为实现多态性作准备。
多态
多态性是指类中具有相似功能的同名函数,并根据不同类的对象对同一消息产生的不同行为。
II、类的申明与创建
- 类的定义由关键字class,其后为用户定义的类名,花括号括起来的部分称为类体(与结构体类似)。结构体就是一个类,但又与类有点不同(默认权限的不同等)
- 权限限定符
- private:私有属性,数据成员一般定义为private属性;
pubilc: 公有属性,是类的外部接口,成员函数一般定义为public属性; - protected:保护属性,类中使用
类的声名与创建:
//-----1申明与创建-------
//权限限定词没有个数限制
#include <iostream>
#include <string>
using namespace std;
class GirlFriend
{
//类中是没有权限可言
//权限只是针对类外对象来说的
//类中没有权限限定的默认是私有属性
void printData()
{
cout << "printData" << endl;
}
public: //公有属性
int age; //数据成员
void print() //成员函数
{
cout << "行为" << endl;
}
private:
string num; //数据成员
protected:
int money; //数据成员
public:
public:
};
//保护和私有属性目前没有区别,继承中在意
//掌握的内容:
//1.学会创建
//2.学会调用
//3.权限限定
//别致创建法
//NO.1 类成员先声明后定义
class MM
{
public:
void printMM();
};
void MM::printMM()
{
cout << "先声明后实现" << endl;
}
//NO.2 在命名空间类,可以先声明后实现
namespace Boy
{
class CoolMan;
}
class Boy::CoolMan
{
public:
void printCoolMan();
};
void Boy::CoolMan::printCoolMan()
{
cout << "剥洋葱" << endl;
}
//No.3 类中类
//学会访问方式
//类中类依然受权限限定
class A
{
public:
void printA()
{
cout << "A" << endl;
}
protected:
public:
class B
{
public:
void printB()
{
cout << "B" << endl;
}
};
};
void testClass()
{
A::B bObject;
bObject.printB();
A aobject;
aobject.printA();
}
----2、主函数
int main()
{
GirlFriend girl; //创建一个对象
GirlFriend* p = new GirlFriend; //new一个对象
//访问数据: 普通对象用.方式访问
//指针: ->方式访问
cout << girl.age << endl;
cout << p->age << endl;
cout << (*p).age << endl; //*指针等效变量
//错误 类外只能访问public下面的数据,其他的数据不能访问
//cout << girl.num << endl;
//cout << p->money << endl;
//p->printData(); //私有属性
delete p;
p = nullptr;
testClass();
return 0;
}
####类中数据的初始化:
数据初始化的方式:
1、定义成员变量的时候直接初始化
2、传参的方式
3、通过共有接口
#include <iostream>
#include <string>
using namespace std;
class MM
{
public:
void printMM() //mm.printMM() : mm.name mm.age
{
cout << name << "\t" << age << endl;
}
//No.2 传参的方式
void initMM(string xName, int xAge)
{
MM::name = xName;
MM::age = xAge;
}
//No.3 通过提供共有接口,类做初始化
string& getName() { return name; }
int& getAge() { return age; }
private:
//No.1 直接初始化
string name="默认";
int age=0;
};
int main()
{
//C++数据包含函数一种数据
MM mm;
mm.printMM();
mm.initMM("小白", 38);
mm.printMM();
mm.getName() = "星";
mm.getAge() = 18;
mm.printMM();
return 0;
}
二、类中函数指针
类中函数指针的定义:函数指针返回类型(*函数指针名A)()=&类中存在的函数B;-------为B函数创建一个函数指针A
函数指针的使用:使用对象的方式调用
注意:要加类名限定,A、B军要加类名限定
#include <iostream>
using namespace std;
class MM
{
public:
void printMM()
{
cout << "MM中的函数" << endl;
}
private:
};
int main()
{
//学会创建一个类中函数指针
void(MM::*Func)() = &MM::printMM;
auto p = &MM::printMM; //类中成员函数指针一定更要用类名限定
//怎么调用
MM mm; //有对象了
mm.printMM();
//mm.p();
//mm.(*p)();
(mm.*p)();
(mm.*Func)();
//(mm->p)();
MM* pMM = new MM;
(pMM->*p)();
return 0;
}
总结
上面我们一起学习了类与对象的区别、如何创建类和对象以及函数指针的使用。
重点掌握类的创建于函数指针的创建与使用。