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版)
如有問題,歡迎在評論區留言交流!