C++程序设计基础实验:C++对C的扩展特性与应用
C++程序设计基础实验:C++对C的扩展特性与应用
🔥 本文详细讲解C++基础实验,包含C++对C语言的扩充与增强特性,从零开始掌握函数重载、引用、指针等核心概念,附详细代码分析与运行结果。适合C++初学者和有C语言基础想学习C++的同学!
一、实验目的
- 熟悉Dev-C++开发环境,了解C++对C语言的扩充与增强
- 掌握集成开发环境下C++程序的编辑、编译、链接和运行方法
- 掌握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语言的printf
和scanf
函数 - 这个程序演示了C++对C的兼容性,即在C++中可以混用C风格的输入输出
- C++风格的等价写法应该使用
cin
和cout
,如cin >> a >> b;
和cout << "a+b=" << c;
实验步骤:
- 在Dev-C++环境中创建新项目
- 输入上述代码并编译运行
- 输入两个整数,如3和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个元素- 最后打印指针
p
和q
指向的值,即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;
}
指针与引用实现对比:
- 语法差异:
- 指针实现需要传递地址
&x
,并使用*a
访问值 - 引用实现直接传递变量
x
,直接使用a
访问值
- 指针实现需要传递地址
- 安全性:
- 引用必须初始化且不能为空,相对更安全
- 指针可以为NULL,使用前需检查
- 代码简洁性:
- 引用实现的代码更简洁易读
运行实例:
输入:3 1 4
输出:1 3 4
四、实验总结
通过本次实验,我们:
- 熟悉了Dev-C++环境下C++的基本编程流程
- 深入理解了C++对C的重要扩充特性:
- 函数重载:同名不同参的函数可以共存,增强代码可读性
- 引用参数:相比指针更安全、语法更简洁的参数传递方式
- 指针操作:C++继承并增强了C语言的指针功能
- 掌握了不同参数传递方式的特点与应用场景:
- 值传递:参数在函数内的修改不影响原值
- 引用传递:参数在函数内的修改直接影响原值
- 指针传递:通过地址间接修改原值
五、思考与拓展
- 函数重载与函数默认参数有何区别?在什么场景下各自更适用?
- C++11及以后版本中引入了移动语义和右值引用,如何理解这些新特性?
- 智能指针如何解决传统指针的内存泄漏问题?
💡 小贴士:在实际开发中,C++的标准库(STL)提供了丰富的容器和算法,如
vector
、sort
等,可以更优雅地实现本实验中的功能,有兴趣的同学可以进一步探索。
参考资料
- C++ Primer(第5版)
- Effective C++(第3版)
- C++标准库(第2版)
如有问题,欢迎在评论区留言交流!