2.0概要
学习目的:
- 明确面向过程和面向对象的区别。
- 掌握面向对象的编程思想。
- 掌握类和对象的关系。
课程内容:
- 回顾总结面向过程。
- 全面了解面向对象。
- 3.深入学习类与对象。
- 学会使用String类。
重点难点:
- 面向对象思想。
- 使用String类。
2.1面向过程
-
是什么?
-
优缺点?
面向过程:提出问题–>分析问题–>处理问题(把一个大问题分解成多个小问题)
面向过程简单,好用,但是不安全,不适合大项目。
2.2面向对象
面向对象的程序设计是面向过程的继承和发展。
面向对象可以理解为:现实世界是由对象组成的。
对象在程序中抽象为两个部分:属性(数据),行为(函数)
类:具有相同类型的属性组成的集合。
实例化:从种类具体到某个个体的过程。
先通过类来实例化一个对象,通过这个对象就可以解决这个问题。
面向对象编程:其实很多学习编程的人,对于面向过程编程和面向对象编程这两个概念总是搞不清,具体的专业的定义在这里也不去说了,根据上面的叙述,我们可以这样去通俗的解释面向对象。
举个例子:我去洗澡。
如果按照面向过程的角度考虑,那么我先进入浴室,然后打开水龙,然后洗漱,然后把身体擦干,也就是说面向过程关注的是解决问题的步骤。
如果用面向对象考虑,只需记住一句话,万物皆对象,你是对象,水龙头也是对象,所以我先传递力的参数给浴室门,然后门就开了,然后我在传递消息给水龙头,水龙头得到消息,放水,最后传递消息给毛巾,毛巾利用它吸水的特性,调用吸水方法擦干身体。
也就是说面向对象关注的是对象,将一个问题拆分为不同对象,依靠参数完成对象之间的交互。
为什么要进行面向对象编程?这也是一个很值得思考的问题。举个例子,活字印刷术发明之前使用的是雕版印刷,这种方式弊端太大,如果需要改稿,那么雕版就必须重新雕刻,而活字印刷术则解决了这样的问题,需要改动,有可能只需改动几处。面向过程正如雕版印刷一样,也正如做数学题一样,中间某个环节一旦出现需求变更,那么整个工程几乎需要大改,要耗费大量时间精力。面向对象正如活字印刷术一样,如果需求变化了,可能只是修改其中一部分,也就是一个对象,而且最关键的一点是这些对象可以服用,进行活字印刷术一样,不是说这个对象在这个工程中发挥完之后,它就没有价值了,它还可能被其他工程所用。
面向对象特点:
- 会把属性和行为总结到一起,用来表达你所创建的对象。
- 面向过程里面属性和行为是分开的,问题比较复杂就可能会丢失数据,或者出现错误的值,导致程序的维护比较困难,但是面向对象可以把这个问题解决掉。把问题分解成为一个个对象可以解决的问题。
面向对象特性:
- 封装:把东西藏起来
- 继承:子承父业
- 多态:不同情况干不同的事情
- 抽象:把对象提取出一些大家都有的属性和行为。(抽象后把这些东西融合到一起就变成了一个类)
- 重用:重复利用
-
多线程:从软件或者硬件上实现多个线程并发执行的技术
-
低耦合:互相之间不怎么影响。
-
高内聚:不会影响到别的。
-
组件编程:不同组件组合到一起,实现丰富的功能。
-
代码托管:执行过程交由运行时管理的代码。
-
适配器模式:允许将一个接口转换为客户希望的另一个接口,目的是使原本由于接口不兼容而无法一起工作的类能够协同工作。
2.3类与对象
类是一种用户自定义的数据类型(函数,数据)
类是具有相同的属性和行为的对象的集合。
类是对象的抽象,对象是类的具体。
对象:通过使用类类型定义的变量。
1.定义类
//语法
class { //类名
//默认是私有的
//成员:1.数据 2.函数
//访问权限修饰关键字
public: //公有的
//成员:1.数据 2.函数
private: //私有的
//成员:1.数据 2.函数
protected: //被保护的
//成员:1.数据 2.函数
};
#include <iostream>
using namespace std;
class Sheep {
public:
char name[32];
private:
int age;
public:
void eat() {
cout << "闲着也是闲着,简单吃点草" << endl;
}
void setAge(int n) {
age = n;
}
void speak();
private:
void speakEnglish() {
cout << "My name is" << name << ",I'am" << age << "。" << endl;
}
};
void Sheep::speak() {
cout << "我叫" << name << ",我" << age << "岁了。" << endl;
}
int main() {
Sheep xiYY;
//xiYY.name = "喜羊羊";<------------这个是错误的
strcpy(xiYY.name, "喜羊羊");//xiYY.name是字符串类型,所以 要用strcpy函数,而不是像上面一样。
//xiYY.age = 10;<-------------------这个也不行,因为age是私有属性,私有属性外面不能直接访问。
xiYY.setAge(12);
xiYY.speak();
return 0;
}
Sheep* pY;
pY->eat();
这么写是有问题的。因为在这里这个指针没有具体指向,也就是说这个指针4个字节,没有指向。
Sheep* pY;
pY = &xiYY;
需要先给这个指针一个首地址,然后再去用。
pY->eat();
C++里面指针要用->
而不是.
对象用.
C++里面struct和class的区别:
- C++里面可以用struct和class来声明一个类。
- C++里面可以用struct去声明结构体。
- 面向对象就用class来定义类,struct来 定义结构体。(因为用class来定义的类权限是私有的,用struct定义的类权限是公有的)
2.4String类
String是C++中的字符串
类似于C语言中的字符数组
其中包括许多方法,使用时需要额外包含<string>
#include<string>
C++里面使用的是#include<string>
而不是#include<string.h>
,但是用了后者也没事,因为C++是兼容C语言的。
string使用:
#include <string>
class Sheep {
public:
char name[32];
string name_str;
};
int main() {
string str;
str = "abc123";
char ch = str[2];
str.length();//统计str长度
str.clear();//清理str
str.empty();//是否为空,空就false,非空就true
str == str;//比较两个字符串
Sheep xiYY;
xiYY.name_str = "xiyy";
cout << xiYY.name_str << endl;
return 0;
}