C++程序设计基础实验:C++对C的扩展特性与应用

C++程序设计基础实验:C++对C的扩展特性与应用

🔥 本文详细讲解C++基础实验,包含C++对C语言的扩充与增强特性,从零开始掌握函数重载、引用、指针等核心概念,附详细代码分析与运行结果。适合C++初学者和有C语言基础想学习C++的同学!

一、实验目的

  1. 熟悉Dev-C++开发环境,了解C++对C语言的扩充与增强
  2. 掌握集成开发环境下C++程序的编辑、编译、链接和运行方法
  3. 掌握C++中特有的引用、函数重载等核心特性

二、实验环境

  • 开发工具:Dev-C++ 5.11或更高版本
  • 操作系统:Windows 10/11
  • 编译器:MinGW GCC

三、实验内容

1. 阅读程序并验证结果

(1) 程序1:C++基本输入输出
#include<iostream>using namespace std;int main() {int a, b, c;printf("Please enter a and b\n");scanf("%d%d", &a, &b);c = a + b;printf("a+b=%d", c);return 0;
}

代码分析:

  • 虽然引入了iostream头文件和namespace std,但实际使用的是C语言的printfscanf函数
  • 这个程序演示了C++对C的兼容性,即在C++中可以混用C风格的输入输出
  • C++风格的等价写法应该使用cincout,如cin >> a >> b;cout << "a+b=" << c;

实验步骤:

  1. 在Dev-C++环境中创建新项目
  2. 输入上述代码并编译运行
  3. 输入两个整数,如3和4
  4. 观察输出结果:a+b=7
(2) 程序2:指针操作
#include<iostream>using namespace std;int main() {int a[] = {1,2,3,4,5,6,7,8,9,10,11,12};int *p = a + 5, *q = a;*q = *(p+5);printf("%d %d", *p, *q);return 0;
}

代码分析:

  • 声明整型数组a包含12个元素(1到12)
  • 指针p指向数组第6个元素(索引5,值为6)
  • 指针q指向数组第1个元素(索引0,值为1)
  • *q = *(p+5)将第11个元素(索引10,值为11)赋值给第1个元素
  • 最后打印指针pq指向的值,即6 11

内存示意图:

数组a:[1][2][3][4][5][6][7][8][9][10][11][12]↑           ↑p           p+5↑q (初始指向1,后来值变为11)

运行结果:6 11

(3) 程序3:引用参数传递
#include<iostream>using namespace std;void fun(int x, int &y) {x += y;  // x仅在函数内改变y += x;  // y的改变会影响调用处
}int main() {int x = 5, y = 10;fun(x, y);  // 第一次调用fun(y, x);  // 第二次调用printf("x=%d, y=%d", x, y);return 0;
}

代码分析:

  • 函数fun第一个参数是值传递,第二个参数是引用传递
  • 第一次调用fun(x, y)时:
    • x=5, y=10
    • 函数内:x变为5+10=15(仅函数内有效)
    • 函数内:y变为10+15=25(影响main函数中y的值)
    • 调用后:x=5(未变),y=25
  • 第二次调用fun(y, x)时:
    • x=5, y=25
    • 函数内:参数x(对应main中的y)变为25+5=30(仅函数内有效)
    • 函数内:参数y(对应main中的x)变为5+30=35(影响main函数中x的值)
    • 调用后:x=35,y=25

运行结果:x=35, y=25

2. 程序查错改错题

(1) 修改程序使其编译通过

原代码:

#include<iostream>
using namespace std;int main()
int a, b;
// ... 省略部分代码

错误分析:

  • main函数缺少左花括号{
  • 变量声明应在函数体内

修正后代码:

#include<iostream>
using namespace std;int main() {  // 添加了左花括号int a, b;  // 将变量声明移到函数体内scanf("%d%d", &a, &b);b += a;printf("%d", b);return 0;
}

运行结果:
当输入3 4时,输出7

3. 程序设计题

(1) 求最大数(函数重载实现)

要求: 实现重载的max函数,分别求两个数和三个数的最大值

实现代码:

#include<iostream>
using namespace std;// 两个整数取最大值
int max(int a, int b) { return a > b ? a : b; 
}// 三个整数取最大值(利用两个数的max函数)
int max(int a, int b, int c) { return max(max(a,b), c); 
}int main() {cout << "两个数的最大值:" << max(3,5) << endl;        // 输出5cout << "三个数的最大值:" << max(2,8,4) << endl;      // 输出8return 0;
}

代码分析:

  • 函数重载是C++特有的特性,允许同名但参数列表不同的函数共存
  • 在本例中,编译器根据传入的参数个数自动选择对应的max函数
  • 三参数版本的max函数复用了两参数版本,体现了代码复用

运行结果:

两个数的最大值:5
三个数的最大值:8
(2) 三数排序(指针和引用实现)

要求: 使用指针和引用分别实现三个数的升序排序

a. 指针形参实现

#include<iostream>
using namespace std;// 使用指针实现三数排序
void sort(int *a, int *b, int *c) {if (*a > *b) swap(*a, *b);if (*a > *c) swap(*a, *c);if (*b > *c) swap(*b, *c);
}int main() {int x, y, z;cout << "请输入三个整数:";cin >> x >> y >> z;sort(&x, &y, &z);cout << "排序后结果:" << x << " " << y << " " << z << endl;return 0;
}

b. 引用形参实现

#include<iostream>
using namespace std;// 使用引用实现三数排序
void sortByReference(int &a, int &b, int &c) {if (a > b) swap(a, b);if (a > c) swap(a, c);if (b > c) swap(b, c);
}int main() {int x, y, z;cout << "请输入三个整数:";cin >> x >> y >> z;sortByReference(x, y, z);cout << "排序后结果:" << x << " " << y << " " << z << endl;return 0;
}

指针与引用实现对比:

  1. 语法差异
    • 指针实现需要传递地址&x,并使用*a访问值
    • 引用实现直接传递变量x,直接使用a访问值
  2. 安全性
    • 引用必须初始化且不能为空,相对更安全
    • 指针可以为NULL,使用前需检查
  3. 代码简洁性
    • 引用实现的代码更简洁易读

运行实例:
输入:3 1 4
输出:1 3 4

四、实验总结

通过本次实验,我们:

  1. 熟悉了Dev-C++环境下C++的基本编程流程
  2. 深入理解了C++对C的重要扩充特性:
    • 函数重载:同名不同参的函数可以共存,增强代码可读性
    • 引用参数:相比指针更安全、语法更简洁的参数传递方式
    • 指针操作:C++继承并增强了C语言的指针功能
  3. 掌握了不同参数传递方式的特点与应用场景:
    • 值传递:参数在函数内的修改不影响原值
    • 引用传递:参数在函数内的修改直接影响原值
    • 指针传递:通过地址间接修改原值

五、思考与拓展

  1. 函数重载与函数默认参数有何区别?在什么场景下各自更适用?
  2. C++11及以后版本中引入了移动语义和右值引用,如何理解这些新特性?
  3. 智能指针如何解决传统指针的内存泄漏问题?

💡 小贴士:在实际开发中,C++的标准库(STL)提供了丰富的容器和算法,如vectorsort等,可以更优雅地实现本实验中的功能,有兴趣的同学可以进一步探索。

参考资料

  1. C++ Primer(第5版)
  2. Effective C++(第3版)
  3. C++标准库(第2版)

如有问题,欢迎在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

量子神经网络编译器开发指南:从理论突破到产业落地全景解析

本文深度剖析IBM Qiskit 5.0量子经典混合编译器的技术架构&#xff0c;详解如何基于含噪量子处理器实现MNIST手写数字分类任务&#xff08;准确率达89%&#xff09;。结合本源量子云、百度量子等国内平台免费配额政策&#xff0c;系统性阐述量子神经网络开发的技术路线与资源获…

ESP32之本地HTTP服务器OTA固件升级流程,基于VSCode环境下的ESP-IDF开发(附源码)

背景知识&#xff1a; 本实验利用编译链内Python内置的 HTTP 服务器&#xff0c;将升级包通过http发送给设备&#xff0c;实现OTA固件升级。 目录 背景知识&#xff1a; 1.创建工程 1.1 创建OTA基础工程 3.编写、修改代码 3.1 修改menuconfig配置文件 3.1.1 配置WiFi账…

BootStrap:进阶使用(其一)

今天我要讲述的是在BootStrap中进一步使用的方法与代码举例; 导航条 作为在应用或网站中作为导航页头的响应式基础组件。导航条在移动设备上可以折叠&#xff08;且可开可关&#xff09;&#xff0c;在视口&#xff08;viewport&#xff09;宽度增加时逐渐变为水平展开模式 …

ffmpeg无损转格式的命令行

将ffmpeg.exe拖入命令行窗口 c:\users\zhangsan>D:\ffmpeg-2025-03-11\bin\ffmpeg.exe -i happy.mp4 -c:v copy -c:a copy 格式转换后.mkv -c:v copy 仅做拷贝视频,不重新编码 -c:a copy 仅做拷贝音频 ,不重新编码

【Linux】深入理解Linux文件系统:从C接口到内核设计哲学

文章目录 前言一、C语言中的文件接口1. 文件指针&#xff08;句柄&#xff09;FILE*以写方式打开文件&#xff0c;若文件不存在会新建一个文件W写入方式&#xff0c;在打开文件之前都会将文件内容全部清空追加写方式&#xff0c;其用法与写方法一致&#xff0c;不同在于a方法可…

国产品牌芯洲科技100V降压芯片系列

SCT2A25采用带集成环路补偿的恒导通时间(COT)模式控制&#xff0c;大大简化了转换器的片外配置。SCT2A25具有典型的140uA低静态电流&#xff0c;采用脉冲频率调制(PFM)模式&#xff0c;它使转换器在轻载或空载条件下实现高转换效率。 芯洲科技100V降压芯片系列提供丰富的48V系…

ctfshow-大赛原题-web702

因为该题没有理解到位&#xff0c;导致看wp也一直出错&#xff0c;特此反思一下。 参考yu22x师傅的文章 &#xff1a;CTFSHOW大赛原题篇(web696-web710)_ctfshow 大赛原题-CSDN博客 首先拿到题目&#xff1a; // www.zip 下载源码 我们的思路就是包含一个css文件&#xff0c;…

LabVIEW技巧——获取文件版本信息

获取可执行文件&#xff08;exe&#xff09;版本信息的几种方法 方法1. LabVIEW自带函数 labview自带了获取文件版本号的VI&#xff0c;但是没有开放到程序框图的函数选板中&#xff0c;在该目录下可以找到&#xff1a;...\LabVIEW 20xx\vi.lib\Platform\fileVersionInfo.llb…

三格电子——CAN 转光纤(点对点)布线常见问题

1、CAN 布线 &#xff08;1&#xff09;H 接 H ,L 接 L &#xff08;2&#xff09;两端设备挂 120 欧姆电阻 2、假如用点对点的 CAN 转光纤现实远程传输 &#xff08;1&#xff09;H 接 H ,L 接 L &#xff08;2&#xff09;光端机都挂 120 欧姆电阻 每个光端机挂的设备有一个加…

python进阶: 深入了解调试利器 Pdb

Python是一种广泛使用的编程语言&#xff0c;以其简洁和可读性著称。在开发和调试过程中&#xff0c;遇到错误和问题是不可避免的。Python为此提供了一个强大的调试工具——Pdb&#xff08;Python Debugger&#xff09;。 Pdb是Python标准库中自带的调试器&#xff0c;可以帮助…

React 设计艺术:如何精确拆分组件接口,实现接口隔离原则

接口隔离原则 接口隔离原则&#xff08;Interface Segregation Principle&#xff0c;简称 ISP&#xff09;也是面向对象设计中的重要原则之一。它的核心思想是&#xff0c;一个类不应该依赖它不需要的接口。在 React 开发中&#xff0c;遵循接口隔离原则可以提高代码的可维护性…

内部聊天软件,BeeWorks-安全的企业内部通讯软件

企业在享受数据便利的同时&#xff0c;如何保障企业数据安全已经成为无法回避的重要课题。BeeWorks作为一款专为企业设计的内部通讯软件&#xff0c;通过全链路的安全能力升维&#xff0c;为企业提供了一个安全、高效、便捷的沟通协作平台&#xff0c;全面保障企业数据安全。 …

【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南

MATLAB Gurobi YALMIP 综合优化教程&#xff08;进阶&#xff09; 本教程系统介绍如何在 MATLAB 环境中使用 YALMIP 建模&#xff0c;并通过 Gurobi 求解器高效求解线性、整数及非线性优化问题。适用于工程、运营研究、能源系统等领域的高级优化建模需求。 一、工具概览 1.…

Freertos----互斥量

一、为什么要使用互斥量&#xff1f; 我们想让任务A、B都执行add_a函数&#xff0c;a的最终结果是18817。 假设任务A运行完代码①&#xff0c;在执行代码②之前被任务B抢占了&#xff1a;现在任务A的R0等于1。 任务B执行完add_a函数&#xff0c;a等于9。 任务A继续运行&#…

高级java每日一道面试题-2025年4月11日-微服务篇[Nacos篇]-Nacos使用的数据库及其数据同步机制是什么?

如果有遗漏,评论区告诉我进行补充 面试官: Nacos使用的数据库及其数据同步机制是什么&#xff1f; 我回答: Nacos 使用的数据库及其数据同步机制详解 在微服务架构中&#xff0c;Nacos 作为服务注册与配置管理的核心组件&#xff0c;其数据存储和同步机制对系统的高可用性和…

揭秘大数据 | 22、软件定义存储

揭秘大数据 | 19、软件定义的世界-CSDN博客 揭秘大数据 | 20、软件定义数据中心-CSDN博客 揭秘大数据 | 21、软件定义计算-CSDN博客 老规矩&#xff0c;先把这个小系列的前三篇奉上。今天书接上文&#xff0c;接着叙软件定义存储的那些事儿。 软件定义存储源于VMware公司于…

git常用修改命令

1. 代码回退与历史修改 git reset 模式命令示例作用范围适用场景--softgit reset --soft HEAD~1仅移动 HEAD 指针重新提交之前的修改--mixedgit reset HEAD~1 (默认)重置暂存区取消已 add 但未提交的文件--hardgit reset --hard a1b2c3d彻底丢弃工作区和暂存区彻底回退到某个…

【ubuntu】linux开机自启动

目录 开机自启动&#xff1a; /etc/rc.loacl system V 使用/etc/rc*.d/系统运行优先级 遇到的问题&#xff1a; 1. Linux 系统启动阶段概述 方法1&#xff1a;/etc/rc5.d/ 脚本延时日志 方法二&#xff1a;使用 udev 规则来触发脚本执行 开机自启动&#xff1a; /etc/…

Python深度学习基础——深度神经网络(DNN)(PyTorch)

张量 数组与张量 PyTorch 作为当前首屈一指的深度学习库&#xff0c;其将 NumPy 数组的语法尽数吸收&#xff0c;作为自己处理张量的基本语法&#xff0c;且运算速度从使用 CPU 的数组进步到使用 GPU 的张量。 NumPy 和 PyTorch 的基础语法几乎一致&#xff0c;具体表现为&am…

光伏产品研发项目如何降本增效?8Manage 项目管理软件在复合材料制造的应用

在复合材料制造领域&#xff0c;特别是光伏PECVD石墨舟和燃料电池石墨双极板等高精尖产品的研发过程中&#xff0c;高效的项目管理直接决定了产品开发周期、质量和市场竞争力。然而&#xff0c;许多企业在项目立项、进度跟踪、资源分配和质量控制等环节面临挑战。 针对这些痛点…