当前位置: 首页 > news >正文

C++面向对象程序设计-北京大学-郭炜【课程笔记(二)】

C++面向对象程序设计-北京大学-郭炜【课程笔记(二)】

  • 1、结构化程序设计
    • 结构化程序设计的不足
  • 2、面向对象的程序设计
    • 2.1、面向对象的程序设计
    • 2.2、从客观事物抽象出类
    • 2.3、对象的内存分配
    • 2.4、对象之间的运算
    • 2.5、使用类的成员变量和成员函数
      • `用法1:对象名.成员名`
      • `用法2:指针->成员名`
      • `用法3:引用.成员名`
    • 2.6、类成员的可访问范围
      • 2.6.1、代码实例
      • 2.6.2、private的意义(隐藏的作用)
      • 2.6.3、成员函数的重载及参数缺省

课程链接:程序设计与算法(三)C++面向对象程序设计 北京大学 郭炜
课程PPT:github提供的对应课程PPT

1、结构化程序设计

C语言使用结构化程序设计:
程序 = 数据结构 + 算法

  • 程序由全局变量以及众多相互调用的函数组成。
  • 算法以函数的形式实现,用于对数据结构进行操作。

结构化程序设计的不足

  • 结构化程序设计中,函数和其所操作的数据结构,没有直观的联系。
  • 随着程序规模的增加,程序逐渐难以理解,很难一下子看出来:
    • 某个函数结构到底有哪些函数可以对他进行操作?
    • 某个函数到底是用来操作哪些数据结构的?
    • 任何两个函数之间存在怎样的低哦啊用关系?
    • 结构化程序设计没有“封装”和“隐藏”的概念。要访问某个数据结构中的某个变量,就可以直接访问,那么当该变量的定义有改动的时候,就要把所有访问该变量的语句找出来修改,十分不利于程序的维护、扩充。
    • 难以查错,当某个数据结构的值不正确时,难以找出到底是哪个函数导致的。
    • 结构化程序设计中,随着程序规模的扩大,由于程序大量函数、变量之间的关系错综复杂,要抽取这部分代码,变得十分困难(无法重用)。

2、面向对象的程序设计

  • 面向对象的程序设方法,能够较好的解决上述结构化程序设计的不足。
    面向对象的程序 = 类 + 类 + ···· + 类
  • 设计程序的过程,就是设计类的过程。

2.1、面向对象的程序设计

面向对象的程序设计方法:

  • 将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以用多个变量描述事物的属性);
  • 将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构(这一步叫“抽象”)。

然后,通过某种语法形式,将数据结构和操作该数据结构的函数“捆绑”在一起,形成一个“”,从而使得数据结构和操作该数据结构的算法呈现出显而易见的紧密关系,这就是“封装”。

面向对象的程序设计具有“抽象”,“封装”,“继承”,“多态”四个基本特点。

面向对象的程序模式:(如下图所示)
在这里插入图片描述

2.2、从客观事物抽象出类

在这里插入图片描述

  • 将长、宽变量和设置长、宽,求面积,以及求周长的三个函数“封装”在一起,就能形成一个‘矩形类’。
  • 长、宽变量成为该“矩形类”的“成员变量”,三个函数成为该类的“成员函数”。成员变量和成员函数统称为类的成员。

代码:

#include <iostream> class CRectangle
{public:int w, h;   // 成员变量// 三个成员函数int Area() {return w * h;}int Perimeter() {return 2 * (w + h);}void Init(int w_, int h_) {w = w_; h = h_;}
};   //必须有分号int main()
{int w,h;CRectangle r;  // r是一个对象std::cout << "请输入w和h"<<std::endl;std::cin >> w >> h;r.Init(w, h);std::cout << r.Area() << std::endl << r.Perimeter();return 0;
}//OUT:
请输入w和h
1
3
面积 = 3; 周长 = 8

通过类,可以定义变量。类定义出来的变量,也称为类的实例,就是我们所说的“对象”
C++中,类的名字就是用户定义的类型的名字。可以像使用基本类型那样来使用它。CRectangle就是一种用户自定义的类型。

2.3、对象的内存分配

  • 和结构变量一样,对象所占用的内存空间的大小,等于所有成员变量的大小之和。
  • 对于上面的CRectangle类,sizeof(CRectangle) = 8
    • 成员函数会占用存储空间,但是一个类的成员函数在内存中只有一份,他被所有对象所共享,成员函数不会放入到对象里面。(对象只包含成员变量,不包含成员函数。)
  • 每个对象各有自己的存储空间。一个对象的某个成员变量被改变了,不会ing下昂另一个对象。

2.4、对象之间的运算

和结构变量一样,对象之间可以用 “=” 进行赋值,但是不能用“==”,“!=”,“<”,“>=“,”<=“,进行比较,除非这些运算符经过了“重载”。

2.5、使用类的成员变量和成员函数

用法1:对象名.成员名

CRectangle r1, r2;
r1.w = 5;
r2.Init(5, 4);

Init函数作用在r2上,即Init函数执行期间访问的w和h是属于r2这个对象的,执行r2.Init不会影响到r1。

用法2:指针->成员名

CRectangle r1,r2;
CRectangle * p1 = & r1;
CRectangle * p2 = & r2;
p1->w = 5;
p2->Init(5,4);  //Init作用在p2指向的对象上

用法3:引用.成员名

CRectangle r2;
CRectangle & rr = r2;
rr.w = 5;
rr.Init(5,4);  // rr的值变了,r2的值也会随着改变void PrintRectangle(CRectangle & r)
{cout << r.Area() << "," << r.Perimeter();
}
CRectangle r3;
r3.Init(5,4);
printRectangle(r3);

2.6、类成员的可访问范围

在这里插入图片描述
在这里插入图片描述

2.6.1、代码实例

#include <iostream> 
#include <stdio.h>
// #include <string.h>class CEmployee { private:char szName[30]; //名字public :int salary; //工资void setName(char * name); void getName(char * name);void averageSalary(CEmployee e1,CEmployee e2);
};void CEmployee::setName( char * name) {strcpy(szName, name); //ok
}
void CEmployee::getName( char * name) {strcpy(name, szName); //ok
} 
void CEmployee::averageSalary(CEmployee e1,CEmployee e2){salary = (e1.salary + e2.salary )/2;
}int main(){CEmployee e;// strcpy(e.szName,"Tom1234567889"); //编译错, 不能访问私有成员e.setName("Tom"); // oke.salary = 5000; //okreturn 0;
}

知识点扩充:C语言中字符串之间的比较【char*】/【string】

2.6.2、private的意义(隐藏的作用)

  • 设置私有成员的机制,叫“隐藏”
  • 隐藏”的目的是强制对成员变量的访问一定要通过成员函数进行,那么以后成员变量的类型等属性修改后,字需要更改成员函数即可。否则,所有直接访问成员变量的语句都需要修改。
  • 如果上面的程序移植到内存空间紧张的手持设备上,希望将szName改为char szName[5],若szName不是私有,那么就要找出所有类似strcpy(e.szName, "Tom1234567889");,这样的语句进行修改,以防止数组越界。这样做很麻烦。
  • 如果将szName变为私有,那么程序中就不可能出现(除非在类的内部)strcpy(e.szName, "Tom1234567889");这样的语句,所有对szName的访问都是通过成员函数来进行,比如:e.setName("Tom"); ,那么,就算szName改短了,上面的语句也不需要找出来修改,只要改setName成员函数,在里面确保不越界就可以了。

2.6.3、成员函数的重载及参数缺省

  • 成员函数也可以重载
  • 成员函数可以带缺省参数
  • 案例如下:
#include <iostream>class Location {private:int x, y;public:void init(int x = 0, int y = 0);// 两个valueX是函数重载关系void valueX(int val) { x = val; }int valueX() { return x; }
};int main() {Location A, B;A.init(5);A.valueX(6);std::cout << A.valueX() ;return 0;
}void Location::init(int x, int y)
{x = x;y = y;
}// OUT
6
  • 注意!!!使用缺省参数需要注意避免有函数重载时的二义性
class Location {private:int x, y;public:void init(int x = 0, int y = 0);两个valueX是函数重载关系(这里存在二义性)void valueX(int val = 0) { x = val; }int valueX() { return x; }
};int main() {Location A;A.valueX();   Error,编译起无法判断调用哪个valueXreturn 0;
}

相关文章:

C++面向对象程序设计-北京大学-郭炜【课程笔记(二)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;二&#xff09;】 1、结构化程序设计结构化程序设计的不足 2、面向对象的程序设计2.1、面向对象的程序设计2.2、从客观事物抽象出类2.3、对象的内存分配2.4、对象之间的运算2.5、使用类的成员变量和成员函数用法1&#x…...

IDEA Ultimate下载(采用JetBrain学生认证)

IDEA Ultimate版本下载 Ulitmate是无限制版&#xff08;解锁所有插件&#xff0c;正版需要付费。学生可以免费申请许可&#xff09;Community是开源社区版本&#xff08;部分插件不提供使用&#xff0c;比如Tomcat插件。免费&#xff09; 我们将通过学生认证获取免费版。 Je…...

Matplotlib plt.plot数据可视化应用案例

Matplotlib 是 Python 中一个非常流行的绘图库&#xff0c;它允许用户创建各种静态、动态、交互式的图表和可视化。plt.plot() 是 Matplotlib 中用于绘制二维数据的基本函数。 下面是一个使用 plt.plot() 的简单数据可视化应用案例&#xff1a; 案例&#xff1a;绘制正弦和余…...

ES实战--集群扩展

查看ES集群状态: GET /_cluster/health?prettytrue当一个节点加入集群的时候,ES会自动地尝试将分片在所有节点上进行均匀分配. 如果更多的节点加入集群,ES将试图在所有节点上均匀分配分片数量.这样每一个新加入的节点都能通过部分数据来分担负载 第二个节点发现第一个节点,并…...

【重要】django默认生成的表的意思记录

accounts_userprofile: 这是与用户相关的个人资料表&#xff0c;通常包含用户的额外信息&#xff0c;比如头像、个人描述等。 accounts_userprofile_groups: 这是用户个人资料和用户组之间的关联表&#xff0c;用于记录用户属于哪些用户组。 accounts_userprofile_user_permiss…...

12.3 OpenGL顶点后处理:平面着色

平面着色 Flatshading Flat shading (平面着色)是一种简化渲染技术&#xff0c;它在光栅化阶段将一个图元&#xff08;primitive&#xff09;的所有顶点赋予相同的颜色或其它输出变量的值。这些赋予的值来自于该图元的“引发顶点”&#xff08;provoking vertex&#xff09;。…...

实验5-6 使用函数判断完全平方数

本题要求实现一个判断整数是否为完全平方数的简单函数。 函数接口定义&#xff1a; int IsSquare( int n ); 其中n是用户传入的参数&#xff0c;在长整型范围内。如果n是完全平方数&#xff0c;则函数IsSquare必须返回1&#xff0c;否则返回0。 裁判测试程序样例&#xff1…...

AI 或许真的能助力中产阶级重塑辉煌 [译]

原文&#xff1a;AI Could Actually Help Rebuild The Middle Class 作者&#xff1a;DAVID AUTOR 译文&#xff1a;AI 或许真的能助力中产阶级重塑辉煌 作者&#xff1a;宝玉 人工智能&#xff08;AI&#xff09;并不一定会夺走我们的工作。相反&#xff0c;它为我们提供了一个…...

C#利用接口实现选择不同的语种

目录 一、涉及到的知识点 1.接口定义 2.接口具有的特征 3.接口通过类继承来实现 4.有效使用接口进行组件编程 5.Encoding.GetBytes(String)方法 &#xff08;1&#xff09;检查给定字符串中是否包含中文字符 &#xff08;2&#xff09;编码和还原前后 6.Encoding.GetS…...

设计模式-适配器模式 Adapter

适配器模式 (Adapter) (重点) 适配器设计模式&#xff08;Adapter Design Pattern&#xff09;是一种结构型设计模式&#xff0c;用于解决两个不兼容接口之间的问题。适配器允许将一个类的接口转换为客户端期望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的…...

算法训练day29Leetcode491递增子序列46全排列47全排列Ⅱ

491 递增子序列 题目描述 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一…...

内网穿透与搭建私人服务器

前言 内网穿透是一种技术&#xff0c;允许用户从外部网络访问内部私有网络中的服务器或设备。这对于想要从任何地方访问家中或办公室内部网络资源的用户非常有用。以下是为初学者准备的关于如何实现内网穿透以及搭建自己的私人服务器的详细指南。 在这个数字化时代&#xff0c;…...

交大论文下载器

原作者地址&#xff1a; https://github.com/olixu/SJTU_Thesis_Crawler 问题&#xff1a; http://thesis.lib.sjtu.edu.cn/的学位论文下载系统&#xff0c;该版权保护系统用起来很不方便&#xff0c;加载起来非常慢&#xff0c;所以该下载器实现将网页上的每一页的图片合并…...

全栈笔记_浏览器扩展篇(manifest.json文件介绍)

manifest.json介绍 是web扩展技术必不可少的插件配置文件,放在根目录作用: 指定插件的基本信息 name:名称manifest_version:manifest.json文件的版本号,可以写2或3version:版本description:描述定义插件的行为: browser_action:添加一个操作按钮到浏览器工具栏,点击按…...

蓝桥杯每日一题(python)

##斐波那契数列的应用 --- 题目斐波那契 题目&#xff1a; 如果数组 A (a0, a1, , an−1) 满足以下条件&#xff0c;就说它是一个斐波那契数组&#xff1a; 1. n ≥ 2&#xff1b; 2. a0 a1&#xff1b; 3. 对于所有的 i(i ≥ 2)&#xff0c;都满足 ai ai−1 ai−2…...

【Vue】工程化开发脚手架Vue CLI

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue⛺️稳重求进&#xff0c;晒太阳 工程化开发&脚手架Vue CLI 基本介绍 Vue Cli是Vue官方提供的一个全局命令工具 可以帮助我们快速创建一个开发Vue项目的标准化基础架子【集成了we…...

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第三天-ARM Linux ADC和触摸屏开发 (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码&#xff1a;1688 教学内容&#xff1a; 1、ADC S3C2440的A/D转换器包含一个8通道的模拟输入转换器&#xff0c;可以将模拟输入信号转换成10位数字编码。 在A/D转换时钟频率为2.5MHz时&…...

LeetCode “AddressSanitizer:heat-use-after-free on address“问题解决方法

heat-use-after-free &#xff1a; 访问堆上已经被释放的内存地址 现象&#xff1a;同样代码在LeetCode上报错&#xff0c;但是自己在IDE手动打印并不会报错 个人猜测&#xff0c;这个bug可能来源于LeetCode后台输出打印链表的代码逻辑问题。 问题描述 题目来自LeetCode的8…...

幸运彩票

L1-6 幸运彩票 分数 15 作者 陈越 单位 浙江大学 彩票的号码有 6 位数字&#xff0c;若一张彩票的前 3 位上的数之和等于后 3 位上的数之和&#xff0c;则称这张彩票是幸运的。本题就请你判断…...

搭建yum仓库服务器

安装 1.安装linux 1.1安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 1.2下载 cd /opt/nginx wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.3解压 tar -xvf nginx-1.25.3.tar.gz 1.4配置 cd nginx-1.25.3 ./configure --pre…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...