当前位置: 首页 > 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…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...