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.pswp.cn/bicheng/77364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77364.shtml
英文地址,請注明出處:http://en.pswp.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;許多企業在項目立項、進度跟蹤、資源分配和質量控制等環節面臨挑戰。 針對這些痛點…