- 前言
- 一、类与对象初识
- 1、什么是面向过程与面向对象,以及它们的优缺点分别是什么
- 面向过程
- 面向对象
- 优缺点
- 2、类与对象
- 类
- 对象
- I、面向对象的三大特征
- 面向对象三大特性
- 抽象(一般忽略这个)
- 封装
- 继承
- 多态
- II、类的申明与创建
- 类的声名与创建:
- 数据初始化的方式:
- 二、类中函数指针
- 总结
前言 一、类与对象初识 1、什么是面向过程与面向对象,以及它们的优缺点分别是什么 面向过程
步骤化:是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象行为化:面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为
优缺点面向过程:
- 优点:性能上它是优于面向对象的,因为类在调用的时候需要实例化,开销过大。
- 缺点:不易维护、复用、扩展
面向对象:
- 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出__低耦合__的系统,使系统更加灵活、更加易于维护
- 缺点:性能比面向过程低
即类别:类是具有相似属性和行为的一组实例集合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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#include 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二、类中函数指针#include 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总结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; }
上面我们一起学习了类与对象的区别、如何创建类和对象以及函数指针的使用。
重点掌握类的创建于函数指针的创建与使用。