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

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版)

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

相关文章:

  • 免费将静态网站部署到服务器方法(仅支持HTML,CSS,JS)
  • 混合精度(Mixed Precision)在科学计算领域应用
  • HAL详解
  • 优化自旋锁的实现
  • npx 的作用以及延伸知识(.bin目录,npm run xx 执行)
  • 大语言模型减少幻觉的常见方案
  • 软考-信息系统项目管理师-2 信息技术发展
  • 360蜘蛛IP完整版,360搜索引擎蜘蛛IP列表.pdf
  • 吃透LangChain(五):多模态输入与自定义输出
  • ftok函数 ---- 生成一个唯一的 System V IPC 键值
  • IP检测工具“ipjiance”
  • ProfibusDP转ModbusRTU网关,流量计接入新方案!
  • CentOS系统中排查进程异常终止的日志
  • 标题:民锋视角下的节奏演变逻辑:探寻市场波动的内在秩序
  • 基于 React 和 CodeMirror 实现自定义占位符编辑器
  • 23种设计模式全面解析
  • React 受控表单绑定基础
  • 【HDFS入门】HDFS性能调优实战:从基准测试到优化策略
  • unity TEngine学习记录3
  • 手撕STL——vector
  • 最大涨幅9800%!金价新高不断,引发期权“末日轮”效应,沪金期权多张合约大涨
  • 七大外贸省市,靠什么撑起一季度的出口?
  • 中国英国商会政府事务主席陶克瑞:重庆经济成就瞩目,中英合作机遇无限
  • 这5种走路姿势,藏着疾病秘密,第2种你可能也有
  • 西安雁塔区委书记王征拟任市领导班子副职,曾从浙江跨省调任陕西
  • 最高法:抢票软件为用户提供不正当优势,构成不正当竞争