先来看看本节知识的结构图吧!

接下来我们就逐步来看一下所有的知识点:

结构的演化

C++中的类是从结构演变而来的, 所以我们可以称C++为”带类的C”.

结构发生质的演变

C++结构中可以定义函数, 称之为成员函数

结构定义格式, 像这样:

struct 结构名 {

数据成员;

成员函数;

}; // 注意这里的分号不要忘记

具体的代码, 像这样:

模型图是这样的:

它表明: 我定义了一个结构体, 有两个私有的数据成员x, y, 两个公有的成员函数setXY(double, x, double y), display();

在定义结构体时, 将数据成员使用private关键字修饰, 则产生封装性. 如果没有没定, 则默认为public

private修饰的数据成员为私有的数据成员, 必须公有的成员函数才能使用, 这就是数据的封装性.

使用方式: 结构对象.成员函数

我们在main函数中这样使用:

注意:

如果结构的数据成员用private关键字修饰

则不能这么访问:

cout << pointA.x << endl; count << pointA.y << endl;

如果public修饰, 则可以这么访问.

不过我们一般为了保证封装性, 将数据成员声明为private, 保证只有成员函数才能访问。

使用构造函数初始化结构对象

函数名与结构同名, 称为构造函数, 专门用于初始化结构对象

分为有参构造函数和无参构造函数

像这样:

模型图是这样的:

它表明: 我定义了一个结构体, 有两个私有的数据成员x, y, 一个无参构造函数Point(), 一个有参构造函数Point(double x, double y), 两个普通的成员函数setXY(double, x, double y), display();

从结构演变成一个简单的类

使用关键字class代替stuct, 就将一个结构演变成一个标准的类啦! 是不是So easy!

像这样:

好的, 从现在开始把我们的目光从struct移开吧, 让我们聚焦于class!

面向过程与面向对象

编程语言是我们和计算机交流的桥梁, 编程技术在发展, 同样的编程语言也在发展, 编程语言从最初的0和1, 到汇编语言, 再到面向过程的语言, 再到面向对象的语言, 反应出了我们的编程思想也在不断的进步, 面向过程只是关注解决问题的步骤, 而面向对象关注解决问题的对象, 也就是谁解决这个问题.

下面我用两个经典的例子来诠释面向过程和面向对象的区别

第一个: 五子棋游戏

面向过程是这样的:

(1)开始游戏 -> (2)黑子下棋 -> (3)绘制画面 -> (4)判断输赢 -> (5)白子下棋 -> (6)绘制画面 -> (7)判断输赢 -> (8)返回步骤(2)

面向对象是这样的:

黑白双方, 负责下棋这个操作

棋盘系统, 负责绘制画面

规则系统, 负责判断是否犯规, 输赢等

第二个: 把大象装进冰箱

面向过程是这样的:

(1)把冰箱门打开 -> (2)把大象装进去 -> (3)把冰箱门关上

面向对象是这样的:

冰箱 -> 开门

冰箱 -> 装大象

冰箱 -> 关门

冰箱是一个对象, 它有开门的操作, 装大象的操作, 关门的操作, 大象也是一个对象

总结

面向过程就是关注解决问题的步骤, 像这样: 第一步打开冰箱门, 第二步装大象, 第三步关闭冰箱门

面向对象就是关注解决问题的对象, 像冰箱, 它有开门的方法, 装大象的方法, 关门的方法

大家知道基本的区别和联系就可以啦。

面向对象程序设计的特点

面向对象的程序设计具有抽象, 封装, 继承和多态性的特点

对象

对象是系统描述客观事物的一个实体, 是构成系统的基本单位

对象用对象名, 属性(数据成员), 操作(功能函数)三要素来描述

对象名: 用来标识一个具体的对象. 如: zhangsan, lisi等

属性: 这个对象的数据成员, 也就是特征, 如: 姓名, 年龄, 性别等

操作: 这个对象所具有的行为, 如: 吃饭, 睡觉, 打豆豆等

像这样:

我们有一个对象

对象名: zhangsan

数据成员: 姓名叫张三, 年龄18岁

成员函数: 会吃饭, 能睡觉, 还喜欢打豆豆

抽象和类

比如我们还有一个学生对象叫李四

我们现在有两个学生对象一个叫张三, 年龄18, 一个叫李四, 年龄20, 比如我们还有一个学生对象叫王五, 年龄22, 假如我们还有好多个学生.

都有姓名, 年龄的基本属性, 也有吃饭, 睡觉, 打豆豆的行为,

我们把这些对象的共同特征进一步抽象出来, 就形成了类的概念

像这样:

这是一个类

类名: Student

数据成员: name, age

成员函数: eat(), sleep(), dadoudou()

我们用代码表示是这样的:

类和对象的关系

类相当于模具

对象相当于用模具所制造出来的东西

类是具有相同的属性和操作的一组对象的集合

对象是这些集合当中的一个个体

这样理解:

李四是一个学生 // 正确, 因为李四是对象, 而学生是类

学生就是李四 // 错误, 学生是一个群体, 怎么可能是单个个体呢

封装

一个经典的例子来加深我们的理解吧!

电视机把各种部件都装在机箱里, 遥控器的所有部件也都装在遥控器里, 我们通过遥控器操作电视机, 而不是我们自己摆弄电视机的各个组件! 比如音量+, 音量-, 而不是咱们去电视机里摆弄线圈!

封装性就是要求一个对象应该具备明确的功能, 并具有接口以便和其它对象相互作用, 对象内部的数据和代码是受保护的, 外界不能访问它们, 只能对象对外提供的接口可以访问它们. 增加独立, 自己的数据只能由自己来操作.

类的封装是通过定义的存取权限实现的, 分为private和public, 对象的外部只能访问对象的公有部分, 也就是public修饰的, 不能访问对象的私有部分, 也就是private修饰的.

继承

继承是一个类可以获得另一个类的特性的机制

像这样:

比如我们有”人”这个类, 它具有姓名, 年龄这两个属性, 吃饭这个行为

我们又有”老师”这个类, 继承自”人”类, 所以它有继承过来的"姓名", "年龄"属性, 还有自己所独有的"职工编号"属性, 有继承过来的"吃饭"行为, 还有自己所独有的"讲课"行为.

我们又有”学生”这个类, 继承自”人”类, 所以它有继承过来的"姓名", "年龄"属性, 还有自己所独有的"学号"属性, 有继承过来的"吃饭"行为, 还有自己所独有的"听课"行为.

总结:子类只需定义它所特有的特征, 而共享父类的特征

多态性

不同的对象可以调用相同名称的函数, 但可导致完全不同的行为的现象称为多态性.

在C++中, 多态性分为两种, 一种称为编译时多态, 另一种为运行时多态

编译时多态:也就是函数重载. 是指同一个函数名可以对应着多个函数的实现, 具体调用哪个函数由参数个数, 参数类型等来决定

运行时多态:也就是虚函数. 在定义了虚函数后, 可以在基类的派生类中对虚函数重新定义, 以实现所想要的功能

使用类和对象

使用string对象

必须包含该类的头文件, #include <string>

像这样:String str = “RayLee”; // 等价于 String str(“RayLee”);

在字符串的末尾系统会加上’’\0”字符来表示字符串的结束, 但是在计算字符串长度的时候不包含'\0'

像这样:

String str2 = ‘A’; // 错误, str2是字符串对象, 不能赋值为字符

我们可以把字符串看成是字符数组

所以我们可以这么使用:

 // 字符串对象
string str = "RayLee"; // 输出字符串中的每个字符, 其中size()为string对象的成员函数, 返回字符串长度
for (int i = ; i < str.size(); i++) {
cout << str[i] << endl;
}

字符串连接符号 +

作用: 将两个字符串或者字符串与字符拼接起来

像这样:

// 两个字符串拼接
string str = "RayLee";
string str2 = " is a student!";
string str3 = str + str2;
cout << str3 << endl; // 字符串跟字符拼接
str3 = str + '!';
cout << str3 << endl; // 现个字符相拼接是不行的
str3 = 'a' + '?'; // 错误, 这样的话就不是拼接了, 就是加法运算啦

使用string类的典型成员函数

string str = "Hello, World!";
cout << str << endl; // size()函数: 给定字符串的长度
unsigned long size = str.size();
cout << "字符串长度: " << size << endl; // find(要查找的字符串, 开始查找的起始位置)函数: 要查找的字符串在给定字符串的起始位置
unsigned long result = str.find("lll");
if (result >= size) {
cout << "没有查找到该字符串" << endl;
} else {
cout << "字符串起始位置为: " << result << endl;
} // substr(起始位置, 截取长度)函数: 给定字符串的子串
string subStr = str.substr(, );
cout << "截取的字符串: " << subStr << endl; // getline()函数: 从cin对象中读出一行给string对象
string inputStr;
getline(cin, inputStr, '\n');
cout << inputStr << endl; // swap()交换函数: 将两个string对象的内容进行交换
string str1 = "I am a student!";
string str2 = "You are a teacher!";
cout << "交换前: " << str1 << " " << str2 << endl;
str1.swap(str2);
cout << "交换后: " << str1 << " " << str2 << endl;

面向过程和面向对象不是对立的, 面向对象是建立在面向过程的基础上的, 它们是相互依存的, 面向过程关注于解决问题的步骤, 而面向对象关注于解决问题中出现的对象, 而对象中则封装了解决问题的步骤, 面向对象是更高级的语言, 但它是依赖于面向过程而存在的, 随着计算机科学与技术的发展, 出现更高级的语言也说不定呢?


自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

C语言C++编程学习交流圈子,【点击进入微信公众号:C语言编程学习基地

有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!

C/C++编程笔记:C++入门知识丨从结构到类的演变的更多相关文章

  1. C/C++编程笔记:C++入门知识丨运算符重载

    本篇要学习的内容和知识结构概览 运算符重载使用场景 常规赋值操作 我们现在有一个类 想要实现这种赋值操作 具体实现如下: 所以说呢,我们在使用运算符进行运算的时候, 实际上也是通过函数来实现运算的. ...

  2. C/C++编程笔记:C++入门知识丨多态性和虚函数

    本篇要学习的内容和知识结构概览 多态性 编译时的多态性称为静态联编. 当调用重载函数时, 在编译期就确定下来调用哪个函数. 运行时的多态性称为动态联编. 在运行时才能确定调用哪个函数, 由虚函数来支持 ...

  3. C/C++编程笔记:C++入门知识丨继承和派生

    本篇要学习的内容和知识结构概览 继承和派生的概念 派生 通过特殊化已有的类来建立新类的过程, 叫做”类的派生”, 原有的类叫做”基类”, 新建立的类叫做”派生类”. 从类的成员角度看, 派生类自动地将 ...

  4. C/C++编程笔记:C++入门知识丨类和对象

    本篇要学习的内容和知识结构概览 类及其实例化 类的定义 将一组对象的共同特征抽象出来, 从而形成类的概念. 类包括数据成员和成员函数, 不能在类的声明中对数据成员进行初始化 声明类 形式为: clas ...

  5. C/C++编程笔记:C++入门知识丨函数和函数模板

    本篇要学习的内容和知识结构概览 函数的参数及其传递方式 1. 函数参数传递方式 传值: 传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存 传地址值: 将实参所对应的内存空间的地址值 ...

  6. C/C++编程笔记:C++入门知识丨认识C++面向过程编程的特点

    一. 本篇要学习的内容和知识结构概览 二. 知识点逐条分析 1. 使用函数重载 C++允许为同一个函数定义几个版本, 从而使一个函数名具有多种功能, 这称之为函数重载. 像这样: 虽然函数名一样, 但 ...

  7. C/C++编程笔记:C++入门知识丨认识C++的函数和对象

    一. 本篇要学习的内容和知识结构概览 二. 知识点逐条分析 1. 混合型语言 C++源文件的文件扩展名为.cpp, 也就是c plus plus的简写, 在该文件里有且只能有一个名为main的主函数, ...

  8. UnityShader学习笔记1 — — 入门知识整理

    注:资料整理自<Unity Shader入门精要>一书 一.渲染流程概念阶段:  应用阶段:(1)准备好场景数据:(如摄像机位置,物体以及光源等)   (2)粗粒度剔除(Culling): ...

  9. AngularJs学习笔记1——入门知识

    1.什么是AngularJs          AngularJs 诞生于2009年,由Misko Hevery 等人创建,后被Google收购,是一个优秀的Js框架,用于SPA(single pag ...

随机推荐

  1. Selenium之浏览器驱动下载和配置使用

    浏览器驱动下载 Chrome浏览器驱动:chromedriver , taobao备用地址 Firefox浏览器驱动:geckodriver Edge浏览器驱动:MicrosoftWebDriver ...

  2. css如何让文字不换行显示?

    在CSS中,可以通过white-space属性来实现文字不换行显示:只要将white-space属性的值为nowrap就可强制文字不换行. white-space属性指定元素内的空白怎样处理.它有以下 ...

  3. MRCTF 2020-“TiKi小组”

    题目状态: OPEN - 正在试图解这道题CLOSED - 这道题还没有打开SOLVED - 解决了!鼓掌撒花! 赛事信息 Flag格式:MRCTF{}起止时间:2020-03-27 18:00:00 ...

  4. [Mybatis]Mybatis常用操作

    Mybatis是目前国内比较流行的ORM框架,特点是可以写灵活的SQL语句,非常适合中小企业的面向数据库开发. 本文总结自己开发过程中常用的Mybatis操作. 一.插入操作 主键自增插入单条 < ...

  5. 汉王JAVA笔试题

    汉王JAVA笔试题 1,jsp中动态include与静态include的区别? (1)动态包含总是会检查文件中的变化,适合用于包含动态页面,并且可以带参数. (2)静态包含不会检查所含文件的变化,适用 ...

  6. Scala 基础(十):Scala 函数式编程(二)基础(二)过程、惰性函数、异常

    1 过程 将函数的返回类型为Unit的函数称之为过程(procedure),如果明确函数没有返回值,那么等号可以省略 注意事项和细节说明 1)注意区分: 如果函数声明时没有返回值类型,但是有 = 号, ...

  7. 02 drf源码剖析之快速了解drf

    02 drf源码剖析之快速了解drf 目录 02 drf源码剖析之快速了解drf 1. 什么是drf 2. 安装 3. 使用 3. DRF的应用场景 1. 什么是drf drf是一个基于django开 ...

  8. Django之 admin组件

    本节内容 路由系统 models模型 admin  views视图 template模板 Django Admin介绍 admin 是django 自带的用来让你进行数据库管理的web app. 提供 ...

  9. mysql数据的增删改-内含经典面试题

    #DML语言 /* 数据操作语言: 插入:insert 修改:update 删除:delete */ #一.插入语句 #方式一:经典的插入 /* 语法: insert into 表名(列名,...) ...

  10. A Great Alchemist 最详细的解题报告

    题目来源:A Great Alchemist A Great Alchemist Time limit : 2sec / Stack limit : 256MB / Memory limit : 25 ...