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

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

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

  • 1、引用的概念
    • 1.1、引用应用的简单示例
    • 1.2、常引用
  • 2、"const"关键字的用法(常量指针/指针常量)
  • 3、动态内存分配
  • 4、内联函数
  • 5、函数重载
    • 5.1、什么是函数重载
    • 5.2、函数的缺省参数

1、引用的概念

下面的写法定义了一个引用,并将其初始化为引用某哥变量。
类型名 & 引用名 = 某变量名;
某个变量的引用,等价于这个变量,相当于该变量的一个别名

// 模板
int = 4;
int & r = n;  // r引用了n,r的类型是int & //案例
int n = 7;
int & r = n;
r = 4;
cout << r; //输出4
cout << n; //输出4

注意事项:
1、定义引用时一定要将其初始化成引用某个变量
2、初始化后,它就一直引用该变量。
3、引用只能引用变量不能引用常量
案例如下:

double a = 4, b = 5;
double & r1 = a;
double & r2 = r1;   // r2也引用a
r2 = 10;
cout << a << endl;  // 输出 10
r1 = b;             // r1 并没有引用b
cout << a << endl;  // 输出 5

1.1、引用应用的简单示例

题目:C语言中,如何编写交换两个整形变量值的函数?

  • 值传递
// 值传递
void swap(int a, int b)
{int tmp;tmp = a; a = b; b = tmp;
}
int n1, n2;
swap(n1, n2);  // n1, n2的值不会被交换
  • 指针传递
// 指针传递
void swap(int * a, int * b)
{int tmp;tmp = *a; *a = *b; *b = tmp;
}
int n1, n2;
swap(& n1, &n2);  // n1, n2的值会被交换
  • 引用传递
// 引用传递
void swap(int & a, int & b)
{int tmp;tmp = a; a = b; b = tmp;
}
int n1, n2;
swap(n1, n2);  // n1, n2的值会被交换
  • 引用案例
int n = 4;
int & SetValue() {return n;}
int main()
{SetValue() = 40;cout << n;return 0;
}  
// 输出:40

1.2、常引用

定义引用时,前面加const关键字,即为常引用

int n;
const int & r = n;
r 的类型是 const int &

常引用的特点

不能通过常引用去修改其引用的内容:
int n = 100;
const int & r = n;
r = 200; // 编译报错
n = 300; // 编译没问题

const type & 和 type & 是不同类型!!!

1、type &类型的引用或type类型的变量可以用来初始化const type & 类型的引用
2、const type 类型的常变量和const type & 类型的引用则不能用来初始化type 类型的引用,除非进行强制类型转化

2、"const"关键字的用法(常量指针/指针常量)

1)定义常量

const int MAX_VAL = 23;
const double Pi = 3.14;
// 常量字符串类型的指针
const char * SCHOOL_NAME = "Peking University";

2)常量指针

注意事项1:不可通过常量指针修改其指向的内容,但常量指针的指向可以发生变化

int n,m;
const int * p = &n;
* p = 5;   // 编译出错
n = 4;     // 编译OK
p = &m;    // 编译OK,常量指针的指向可以发生变化

注意事项2:不能把常量指针赋值给非常量指针,反过来可以(如下案例)

const int * p1;   // 常量指针
int * p2;         // 指针
p1 = p2;          // 编译OK
p2 = p1;          // 编译error
p2 = (int *)p1;   // 编译OK,强制类型转换

注意事项3:函数参数为常量指针时,可避免函数内部不小心改变参数指针所指地方的内容。

void MyPrintf(const char * p)
{// 函数strcpy第一个参数是char型,p是const char型strcpy(p, "this");  //编译errorprintf("%s", p);    //OK
}

3、动态内存分配

用new运算符实现动态内存分配

  • 第一种用法,分配一个变量

P = new T;
T是任意类型名,P是类型为T * 的指针。
动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的其实地址复制给P。比如:

int * pn;
pn = new int;
* pn = 5;
  • 第二种用法,分配一个数组

P = new T[N];
T:任意类型名;P:类型为T * 的指针;N:要分配的数组元素的个数,可以是整形表达式。
动态分配出一片大小为N * sizeof(T);字节的内存空间,并将该内存空间的起始地址赋值给P;

int * pn;
int i = 5;
pn = new int[i * 20];  // i✖️20个元素
pn[0] = 20;
pn[100] = 30;		// 编译OK。运行时error数组越界
  • new 运算符的返回值类型;
new T;
new T[n];

这两个表达式返回值的类型都是T *

int * p = new int;
  • 用delete运算符释放动态分配的内存

1、用“new” 动态分配的内存空间,一定要“delete”运算符进行释放
delete 指针; // 该指针必须执行new出来的空间

int * p = new int;
* p = 5;
delete p;
delete p;   // error,一片空间不能被delete多次

2、用“delete”释放动态分配的数组,要加“[]”
delete [] 指针; // 该指针必须执行new出来的空间

int * p = new int[20];
p[0] = 1;
delete [] p;

4、内联函数

  • 函数调用是有时间开销的。如果函数本身就只包含几条语句,执行非常快,由于函数被反复执行很多次,相比之下调用函数所产生的这个开销就会显得比较大。
  • 为了减少函数调用的开销,引入了内联函数机制。编译起处理内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句。
  • 使用内联函数的缺点也是非常明显的,编译后的程序会存在多份相同的函数拷贝,如果被声明为内联函数的函数体非常大,那么编译后的程序体积也将会变得很大,所以再次强调,一般只将那些短小的、频繁调用的函数声明为内联函数。

在函数定义前面加“inline”关键字,即可定义内联函数

inline int Max(int a, int b){if(a > b) return a;return b;
}

如在在主函数中调用内联函数k = Max(n1, n2);,编译器会将其变成如下形式:

if (n1, n2)tmp = n1;
else tmp = n2;k = tmp;

5、函数重载

5.1、什么是函数重载

函数重载一个或多个函数,名字相同,然而参数个数参数类型不相同,这叫函数的重载。
以下三个函数是重载关系:

int Max(double f1, double f2) { };
int Max(int n1, int n2) { };
int Max(int n1, int n2, int n3) {};

作用

  • 函数重载使得函数命名变得简单。
  • 编译器根据调用语句中的实参的个数和类型判断应该调用哪个函数。
(1)    int Max(double f1, double f2) { };
(2)    int Max(int n1, int n2) { };
(3)    int Max(int n1, int n2, int n3) {};
Max(3.4, 2.5);    // 调用(1)
Max(2,4);         // 调用(2)
Max(1, 2, 3);     // 调用(3)
Max(3, 2.4);      // error,二义性

5.2、函数的缺省参数

C++中,定义函数的时候可以让最右边的连续若干个参数有缺省值,那么调用函数的时候,若相应位置不写参数,参数就是缺省值。

void func(int x1, int x2 = 2, int 3 = 3) {}func(10);       // 等效于func(10, 2, 3)
func(10, 8);    // 等效于func(10, 8, 3)
func(10, , 8);  // error,只能最右边的连续若干个参数缺省
  • 函数参数可缺省的目的在于提高程序的可扩充性
  • 即如果某个写好的函数要添加新的参数,而原先那些调用该函数的语句,未必需要使用新增的参数,那么为了避免对原先那些函数调用语句的修改,就可以使用缺省函数。

相关文章:

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

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;一&#xff09;】 1、引用的概念1.1、引用应用的简单示例1.2、常引用 2、"const"关键字的用法&#xff08;常量指针/指针常量&#xff09;3、动态内存分配4、内联函数5、函数重载5.1、什么是函数重载5.2、函数…...

C语言:国家名称按字母表排序

题目描述 输入一个整数n(n<20)&#xff0c;表示待输入国家的数量。随后输入n个国家或地区的名称 (名称长度为1~30)&#xff0c;要求按字母顺序升序输出。 注意&#xff1a;名称中可能包含空格符。 提示 字符串比较请使用函数&#xff1a; int strcmp(const char* str1&a…...

2/18作业

1. #!/bin/bash function fun() { uidgrep ^ubuntu /etc/passwd | cut -d : -f 3 gidgrep ^ubuntu /etc/passwd | cut -d : -f 4 echo "uid为$uid,gid为$gid" } resultfun echo $result...

书生浦语笔记与作业汇总

第一节笔记 第二节笔记与作业 第三节笔记 第三节作业 第四节笔记 第四节作业 第五节笔记 第五节作业 第六节笔记 第六节作业...

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之自动创建节点 (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码&#xff1a;1688 驱动程序编写好后&#xff0c;还需要创建设备节点&#xff0c;有两种方式&#xff0c;一是通过mknod命令去手动创建&#xff0c;例如&#xff1a;mknod /dev/hello c 250 0&…...

基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

功能介绍 以51/STM32单片机作为主控系统&#xff1b; LCD1602液晶显示当前时间、温湿度、药品重量 3次吃药时间、药品类目和药品数量 HX711压力采集当前药品重量 红外感应当前药盒是否打开 DS1302时钟芯片显示当前年月日、时分秒、星期 DHT11采集当前环境温度和湿度 …...

【学网攻】 第(27)节 -- HSRP(热备份路由器协议)

系列文章目录 目录 系列文章目录 文章目录 前言 一、HSRP(热备份路由器协议)是什么&#xff1f; 二、实验 1.引入 实验目标 实验背景 技术原理 实验步骤 实验设备 实验拓扑图 实验配置 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交…...

【实战】二、Jest难点进阶(三) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(七)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶3.mock timers 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&#xff1a; 项版本babel/core…...

Python编程中的异常处理

什么是异常&#xff1f; 程序错误&#xff08;errors&#xff09;有时也被称为程序异常&#xff08;exceptions&#xff09;&#xff0c;这是每个编程人员都会经常遇到的问题。在过去&#xff0c;当遇到这类情况时&#xff0c;程序会终止执行并显示错误信息&#xff0c;通常是…...

mysql3.7之触发器

1.触发器的定义 触发器是由事件来触发某个操作&#xff0c;这些事件包括INSERT、UPDATE、DELETE事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序&#xff0c;当数据库执行这些语句时候&#xff0c;就相当于事件发生了&#xff0c;就会自动激发触发器执行…...

12.QT文件对话框 文件的弹窗选择-QFileDialog

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 界面 2.信号槽 3.其他函数 参考&#xff1a; 前言&#xff1a; 通过按钮实现文件弹窗选择以及关联的操作 效果图就和平时用电脑弹出的选文件对话框一样 技能&#xff1a; QString filename QFileDialog::ge…...

ArcGIS学习(八)基于GIS平台的控规编制办法

ArcGIS学习(八)基于GIS平台的控规编制办法 上一任务我们学习了”如何进行图片数据的矢量化?" 这一关我们来学习一个比较简单的案例一一”如何在ArcGIS中录入控规指标,绘制控规图纸?" 首先,先来看看这个案例的分析思路以及导入CAD格式的控规图纸。 接着,来看…...

软件测试-自动化测试-面试题研究,知识要点,高频、重点知识点,自动化测试知识要点、知识梳理-PYTHON+自动化,评估试题

自动化项目实战能力评估 介绍一下你的自动化测试框架&#xff1f; 我的框架主要根据分层思想设计了几个独立模块&#xff1a; 模块一&#xff1a;主要存放通用业务代码&#xff0c;比如接口访问&#xff0c;数据库操作&#xff0c;excel 操作&#xff0c;等等 模块二&#xf…...

一.重新回炉Spring Framework: 理解Spring IoC

1. 写在前面的话 说实话&#xff0c;从事java开发工作时间也不短了&#xff0c;对于Spring Framework&#xff0c;也是天天用&#xff0c;这期间也碰到了很多问题&#xff0c;也解决了很多问题。可是&#xff0c;总感觉对Spring Framework还是一知半解&#xff0c;不能有个更加…...

目标检测算法之YOLOv5的应用实例(零售业库存管理、无人机航拍分析、工业自动化领域应用的详解)

1.YOLOv5在"零售业库存管理"领域的应用 在零售业库存管理中,YOLOv5可以帮助自动化商品识别和库存盘点过程。通过使用深度学习模型来实时识别货架上的商品,零售商可以更高效地管理库存,减少人工盘点的时间和成本。以下是一个使用YOLOv5进行商品识别的Python脚本示…...

[蓝桥 2017]九宫幻方

九宫幻方 题目描述 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三阶幻方指的是将 1~9 不重复的填入一个 3*3 的矩阵当中&#xff0c;使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称作九宫格&#xf…...

Qt - 编译报错:“invalid use of incomplete type ‘class Ui::xxx‘ui(new Ui::xxx)”的解决方法

问题起因 今天在创建Qt设计器界面类时&#xff0c;类名的英文拼写错误&#xff0c;然后就重命名了文件&#xff0c;而Qt Creator也帮我自动修改了一部分内容&#xff0c;之后我手动将cpp文件中的#include " *** "里的内容给修改了&#xff0c;构造函数和析构函数处也…...

基于Doris构建亿级数据实时数据分析系统

背景 随着公司业务快速发展&#xff0c;对业务数据进行增长分析的需求越来越迫切&#xff0c;与此同时我们的业务数据量也在快速激增、每天的数据新增量大概在30w 左右&#xff0c;一年就会产生1 个亿的数据&#xff0c;显然基于传统MySQL数据库已经无法支撑满足以上需求 基于上…...

javascript中的prototype;javascript中的原型链

文章目录 深入理解JavaScript原型链1. 什么是原型链&#xff1f;2. 原型链的结构3. 如何访问原型链&#xff1f;4. 示例演示原型链5. 原型链与继承6. 实际应用场景 深入理解JavaScript原型链 1. 什么是原型链&#xff1f; 在JavaScript中&#xff0c;每个对象都有一个原型&am…...

CI/CD部署

什么是CI&#xff0c;什么是CD CI和CD是软件开发中持续集成和持续交付的缩写。 CI代表持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;是一种实践&#xff0c;旨在通过自动化构建、测试和代码静态分析等过程&#xff0c;频繁地将代码变更合并到共享存储…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...

手动给中文分词和 直接用神经网络RNN做有什么区别

手动分词和基于神经网络&#xff08;如 RNN&#xff09;的自动分词在原理、实现方式和效果上有显著差异&#xff0c;以下是核心对比&#xff1a; 1. 实现原理对比 对比维度手动分词&#xff08;规则 / 词典驱动&#xff09;神经网络 RNN 分词&#xff08;数据驱动&#xff09…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…...

2025-06-01-Hive 技术及应用介绍

Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具&#xff0c;它为海量结构化数据提供类 SQL 的查询能力&#xf…...