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

发布于:2025-04-21 ⋅ 阅读:(13) ⋅ 点赞:(0)

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;        // 输出5
    cout << "三个数的最大值:" << max(2,8,4) << endl;      // 输出8
    return 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版)

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


网站公告

今日签到

点亮在社区的每一天
去签到