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

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...