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

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

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

  • 1、this指针
    • 1.1、this指针的作用
    • 1.2、this指针和静态成员函数
  • 2、静态成员变量和静态成员函数
    • 2.1、基本概念
    • 2.2、基本概念总结
    • 2.3、如何访问静态成员
    • 2.4、静态成员变量的使用场景(重要)
    • 2.5、2.4节中CRectangle类写法,有何缺陷?
  • 3、成员对象和封闭类
    • 3.1、封闭类构造函数的初始化列表
    • 3.2、封闭类构造函数和析构函数调用顺序
    • 3.3、封闭类的复制构造函数(难理解)

开始课程:P11 1_1. this指针
课程链接:程序设计与算法(三)C++面向对象程序设计 北京大学 郭炜
课程PPT:github提供的对应课程PPT

1、this指针

C++是没有自身编译器的,需要使用C语言的编译器,所以C++在编译时需要把语言转换为对应的C语言。

实例1:C++程序到C程序的翻译:(下图好理解,不做解释)

在这里插入图片描述

1.1、this指针的作用

this指针的作用:指向成员函数所作用的对象。
非静态成员函数中可以直接使用this来代表指向该函数
作用的对象的指针。

实例2:

#include<iostream>class Complex
{public:double real, imag;void Print(){std::cout << real << "," << imag;}Complex(double r, double i): real(r), imag(i){     }Complex AddOne(){this -> real++;   // 等价于 real++this -> Print();  // 等价于 Print()return * this;    // 返回this指:代表返回修改对象的自身}
};int main ()
{Complex c1(1, 1), c2(0, 0);c2 = c1.AddOne();   // 这里就用到了return * this;return 0;
}
// OUT
2,1

实例3:

在这里插入图片描述
实例4:

在这里插入图片描述

1.2、this指针和静态成员函数

静态成员函数中不能使用 this 指针!因为静态成员函数并不具体作用与某个对象! 因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数!

2、静态成员变量和静态成员函数

2.1、基本概念

静态成员:在说明前面加了static关键字的成员。
定义:普通成员变量每个对象有各自的一份,而静态成员变 量一共就一份,为所有对象共享。

  • 普通成员要量、函数:对于無一TCRectangle对象来说都是单独一份的,每个对象之间相互不干扰。
  • 静态成员变量或函数:对于每一个CRectangle对象之间是共享的,更改其中一个CRectangle对象的静态成员变量或函数,其他CRectangle对象的静态成员变量和函数也随之改变。

在这里插入图片描述

  • 普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享

在这里插入图片描述

2.2、基本概念总结

  • 普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享
  • 普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用与某个对象
  • 因此静态成员不需要通过对象就能访问
  • 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
  • 静态成员函数本质上是全局函数。
  • 设置静态成员这种机制的目的是将和某些类紧密相关的全局变
    量和函数写到类里面,看上去像一个整体,易于维护和理解。

2.3、如何访问静态成员

1、类名::成员名

Cectangle::PrintTotal();

2、对象.成员名

Cectangle r;
r.PrintToTal();

3、指针->成员名

Cectangle * p = & r;
p -> PrintTotal();

4、引用.成员名

Cectangle & ref = r;
int n = ref.nTotalNumber;

2.4、静态成员变量的使用场景(重要)

静态成员变量的作用:考虑一个需要随时知道矩形总数和总面积的图形处理程序,可以用全局变量来记录总数和总面积,用静态成员将这两个变量封装进类中,就更容易理解和维护

注意事项1:必须在定义类的文件中对静态成员变量进行一次声明,声明的同时可以初始化,也可以不出初始化。

实例:

#include<iostream>class CRectangle
{private:int w, h;static int nTotalArea;static int nTotalNumber;public:CRectangle(int w_,int h_);~CRectangle();static void PrintTotal(); 
};CRectangle::CRectangle(int w_, int h_)
{w = w_;h = h_;nTotalNumber ++;nTotalArea += w * h;
}CRectangle::~CRectangle()
{nTotalNumber --;nTotalArea -= w * h;
}void CRectangle::PrintTotal()
{std::cout << "nTotalNumber = " << nTotalNumber << ";" << "nTotalArea = " << nTotalArea << std::endl;
}// 注意事项:必须在定义类的文件中对静态成员变量进行一次声明
// 或初始化。否则编译能通过,链接不能通过。
int CRectangle::nTotalNumber = 0;   // 声明的同时可以初始化,也可以不出初始化
int CRectangle::nTotalArea = 0;int main()
{CRectangle r1(3,3), r2(2,2);//cout << CRectangle::nTotalNumber; // Wrong , 私有CRectangle::PrintTotal();   // 输出:nTotalNumber = 2;nTotalArea = 13r1.PrintTotal();            // 输出:nTotalNumber = 2;nTotalArea = 13r2.PrintTotal();            // 输出:nTotalNumber = 2;nTotalArea = 13return 0;
}// OUT
nTotalNumber = 2;nTotalArea = 13
nTotalNumber = 2;nTotalArea = 13
nTotalNumber = 2;nTotalArea = 13

注意事项2:在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。
在这里插入图片描述

2.5、2.4节中CRectangle类写法,有何缺陷?

在这里插入图片描述
解决办法:为CRectangle类写一个复制构造函数
在这里插入图片描述

3、成员对象和封闭类

封闭类: 一个类的成员变量是另一个类的对象包含,此成员对象的类叫封闭类 (Enclosing)

#include<iostream>
class CTyre 
{ //轮胎类private:int radius; //半径 int width; //宽度public:CTyre(int r, int w):radius(r), width(w) { }
};
class CEngine   // 这个类什么都没写,有无参构造函数
{ //引擎类
};class CCar 
{ //汽车类 “封闭类”private:int price; //价格CTyre tyre;CEngine engine;   // 不用初始化,有无参构造函数public:CCar(int p, int tr, int tw);  // 构造函数的声明
};
CCar::CCar(int p, int tr, int w)  // 构造函数的定义
:price(p), tyre(tr, w)   // 构造函数的初始化:初始化列表
{
};
int main()
{CCar car(20000,17,225); return 0;
}

·

3.1、封闭类构造函数的初始化列表

1、定义封闭类的构造函数时,添加初始化列表
类名::构造函数(参数表):成员变量1(参数表),成员变量2(参数表), …
{

}

2、成员对象初始化列表中的参数

  • 任意复杂表达式
  • 函数 / 变量 / 表达式中的函数,变量有定义

3.2、封闭类构造函数和析构函数调用顺序

在这里插入图片描述

实例:

#include<iostream>
using namespace std;class CTyre {public:CTyre() { cout << "CTyre contructor" << endl; }~CTyre() { cout << "CTyre destructor" << endl; }
};
class CEngine {public:CEngine() { cout << "CEngine contructor" << endl; }~CEngine() { cout << "CEngine destructor" << endl; }
};class CCar {private:CEngine engine;CTyre tyre;public:CCar( ) { cout << "CCar contructor" << endl; }~CCar() { cout << "CCar destructor" << endl; }
};int main()
{CCar car; return 0;
}// OUT
CEngine contructor
CTyre contructor
CCar contructor
CCar destructor
CTyre destructor
CEngine destructor

3.3、封闭类的复制构造函数(难理解)

#include<iostream>class A
{public:A() { std::cout << "default" << std::endl;}A(A & a){{std::cout << "copy" << std::endl;}}
};// 封闭类
class B 
{A a;
};int main()
{B b1, b2(b1);  // b1调用了B类的自动生成的无参构造函数,b2调用了B类的自动生成的复制构造函数return 0;
}
// OUT
default
Copy

输出:default、Copy
说明b2.a是用类A的复制构造函数初始化的。而且调用复制构造函数时的实参就是b1.a。

相关文章:

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

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;四&#xff09;】 1、this指针1.1、this指针的作用1.2、this指针和静态成员函数 2、静态成员变量和静态成员函数2.1、基本概念2.2、基本概念总结2.3、如何访问静态成员2.4、静态成员变量的使用场景&#xff08;重要&…...

前端构建效率优化之路

项目背景 我们的系统&#xff08;一个 ToB 的 Web 单页应用&#xff09;前端单页应用经过多年的迭代&#xff0c;目前已经累积有大几十万行的业务代码&#xff0c;30 路由模块&#xff0c;整体的代码量和复杂度还是比较高的。 项目整体是基于 Vue TypeScirpt&#xff0c;而构…...

react实现拖拽的插件

插件一&#xff1a;dnd-kit 插件官网链接https://docs.dndkit.com/introduction/installation 插件二&#xff1a;react-beautiful-dnd https://github.com/atlassian/react-beautiful-dnd/tree/master 两个插件的区别&#xff1a; 插件一可以做到从区域A拖住到区域B 插件二…...

解决Uncaught SyntaxError: Cannot use import statement outside a module(at XXX)报错

报错原因&#xff1a;这个错误通常是因为你正在尝试在一个不支持 ES6 模块语法的环境中使用 import 语句。这可能是因为你的代码是在一个只支持 CommonJS 或 AMD 模块系统的环境中运行的&#xff0c;或者你的代码运行的环境没有正确配置以支持 ES6 模块。如果是在浏览器环境&am…...

PHP如何利用post与get方式传值接收数据

目录 一、POST传值1. 使用curl库发送 POST 请求&#xff1a;2. 使用file_get_contents()函数发送 POST 请求&#xff1a;3. 使用stream_socket_client()函数发送 POST 请求&#xff1a;4. 利用from表单提交数据&#xff1a; 二、GET传值1. 使用http_build_query()函数构建 URL …...

在Mac上搭建MongoDB环境

最近工作中需要装MongoDB环境&#xff0c;搭建过程中遇到了一些问题&#xff0c;在这里记录一下安装MongoDB环境的方法以及问题的解决方法。有两种安装MongoDB的方法&#xff1a;brew安装和手动安装。 目录 使用Homebrew安装MongoDB 手动安装MongoDB&#xff08;不使用Homebr…...

第三十九天| 62.不同路径、63. 不同路径 II

Leetcode 62.不同路径 题目链接&#xff1a;62 不同路径 题干&#xff1a;一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “…...

提高代码质量的 10 条编码原则

提高代码质量的 10 条编码原则 本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 今天来聊聊提高代码质量的 10 条编码原则。 软件开发需要良好的系统设计和编码标准。我们在下图中列出了 10 条良好的编码原则。 01 遵循代码规范 我们…...

SHERlocked93 的 2017 年终总结

回家的路上有点无聊&#xff0c;简短回顾一下2017年的得失收获 开始两个月3月到5月用C#完结了一个烂尾的wpf小项目&#xff0c;对自己前半年的.net生涯也算是一个句号&#xff08;虽然不知道最后有没有采用&#xff09;&#xff0c;后面由于项目组转变技术栈&#xff0c;选择了…...

【FreeRTOS基础入门】任务通知

文章目录 前言一、任务通知介绍1.1 任务通知怎么通信1.2 任务通知与其他通信方式的区别1.3 优势及限制任务通知的优势任务通知的限制 1.4 内部原理 二、任务通知的使用2.1 发出与接收通知简化版2.1 发出与接收通知专业版 总结 前言 FreeRTOS 提供了丰富而灵活的任务通知机制&a…...

python opencv比较图片相似度

目录 一:均值哈希算法 二:三直方图算法 三:单通道直方图 一:均值哈希算法 均值哈希算法是一种快速比较图像相似度的方法。它首先将图像转化为灰度图像,然后计算图像的均值,接着将每个像素的...

校园兼职|大学生校园兼职小程序|基于微信小程序的大学生校园兼职系统设计与实现(源码+数据库+文档)

大学生校园兼职小程序目录 目录 基于微信小程序的大学生校园兼职系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户​微信端功能模块​ 2、管理员服务端功能模块 &#xff08;1&#xff09; 兼职管理 &#xff08;2&#xff09;论坛管理 &#xff08;3&…...

linux系统离线安装docker服务教程

1、下载、上传docker-20.10.0.tgz压缩包至服务器&#xff0c;其中&#xff0c;docker下载地址https://download.docker.com/linux/static/stable/x86_64/ 2、新建安装docker脚本docker-install.sh #!/usr/bin/env bash tar -xvf docker-20.10.0.tgzcp docker/* /usr/bin/cat …...

【青龙】快速搭建青龙面板,部署属于你自己的应用!

青龙面板是一个支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。 废话不多说&#xff0c;直接开始。 这里使用一台 雨云 的云服务器作为演示。雨云注册地址&#xff1a;https://www.rainyun.com/ 优惠码&#xff1a;lz932 使用优惠码注册后绑定微信可获得8折…...

shell脚本实现Mysql分库分表备份

一.数据库的分库分表&#xff1f; 12张图把分库分表讲的明明白白&#xff01;阿里面试&#xff1a;我们为什么要分库分表https://mp.weixin.qq.com/s?__bizMzU0OTE4MzYzMw&mid2247547792&idx2&sn91a10823ceab0cb9db26e22783343deb&chksmfbb1b26eccc63b784879…...

【算法 - 动态规划】从零开始学动态规划!(总纲)

动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种优化问题求解方法&#xff0c;通常用于解决具有 重叠子问题 和 最优子结构 性质的问题。它的基本思想是将原问题分解成更小的子问题&#xff0c;通过求解和保存这些子问题的解&#xff0c;避…...

从 Elasticsearch 到 Apache Doris,统一日志检索与报表分析,360 企业安全浏览器的数据架构升级实践

导读&#xff1a;随着 360 企业安全浏览器用户规模的不断扩张&#xff0c;浏览器短时间内会产生大量的日志数据。为了提供更好的日志数据服务&#xff0c;360 企业安全浏览器设计了统一运维管理平台&#xff0c;并引入 Apache Doris 替代了 Elasticsearch&#xff0c;实现日志检…...

【力扣 - 二叉树的直径】

题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 提示&#xff1a; 树中节点数目在范围 [1, 10000] 内…...

大数据,对于生活的改变

谷歌通过对于疾病的查询量可以预测一个个h1n1病毒的大爆发&#xff0c; 大数据时代对于人的考验 用户的搜索记录就是一种信息&#xff0c;这种信息会满足其基础相关的词条与其有关的词条&#xff08;最为原始的搜索机制&#xff0c;国内的搜索引擎都是采用这种基础原理。&…...

py2neo和neo4j

py2neo 和 neo4j 是两个 Python 中与 Neo4j 图数据库交互的库&#xff0c;但它们有不同的设计和使用方式。 py2neo: 类型: py2neo 是一个面向对象的库&#xff0c;提供了一个对象模型&#xff0c;使得与 Neo4j 数据库的交互更加 Pythonic。API 风格: 使用 Node 和 Relationship…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...