c++入門-------命名空間、缺省參數、函數重載

C++系列


文章目錄

  • C++系列
  • 前言
  • 一、命名空間
  • 二、缺省參數
    • 2.1、缺省參數概念
    • 2.2、 缺省參數分類
      • 2.2.1、全缺省參數
      • 2.2.2、半缺省參數
    • 2.3、缺省參數的特點
  • 三、函數重載
    • 3.1、函數重載概念
    • 3.2、構成函數重載的條件
      • 3.2.1、參數類型不同
      • 3.2.2、參數個數不同
      • 3.2.3、參數類型順序不同


前言

在學習C++之前,首先我們要知道—C++是在C的基礎之上,容納進去了面向對象編程思想,并增加了許多有用的庫,以及編程范式等。這篇文章可以幫助我們了解c++是如何:

  1. 補充C語言語法的不足,以及C++是如何對C語言設計不合理的地方進行優化的。
  2. 為后續類和對象學習打基礎。

一、命名空間

隨著c語言的不斷發展和完善,C語言庫函數和關鍵字的定義,越來越多,這些變量、函數和類的名稱將都存在于全局作用域中,而在我們編寫程序時定義的函數、變量有時就會和庫中所定義的發生沖突,如:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C語言沒辦法解決類似這樣的命名沖突問題,所以C++提出了namespace來解決
int main()
{printf("%d\n", rand);return 0;
}

在這里插入圖片描述
注:這里的報錯就是因為在庫中有一個rand()函數,與我們定義的rand變量名字沖突了。
C語言沒有辦法很好的解決這類問題,c++便提供了命名空間的方法,命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染,namespace關鍵字的出現就是針對這種問題的。
命名空間定義:
定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名空間的成員,如:

namespace ltn
{// 命名空間中可以定義變量/函數/類型int rand = 10;int Add(int left, int right){return left + right;}
}
注意:一個命名空間就定義了一個新的作用域,命名空間中的所有內容都局限于該命名空間中

現在命名沖突的問題我們解決了,但是當你嘗試對類中的函數進行調用時又會出現問題,如:

namespace ltn
{int rand = 10;int Add(int left, int right){return left+right;}
}
int main()
{Add(1, 1);return 0;
}

在這里插入圖片描述

這是因為對于這個命名空間中所定義函數、變量等,我們是不可以直接訪問的,需要配合“::”域作用符,指定域來進行訪問,如:

namespace ltn
{int rand = 10;int Add(int left, int right){return left+right;}
}
int main()
{printf("%d\n", ltn::rand);ltn::Add(1, 1);return 0;
}

如果我們不指定域,編譯器首先會去局部查找,其次會去全局域查找,并不會去我們所定義的命名空間中查找,這一點會在后面驗證。
在我們編寫c++代碼時,往往會在代碼中,編寫這樣一段代碼“using namespace std;”這里的std就是我們標準庫所在的域,而這句代碼的意思就是,將這個命名空間展開(權限放開),使我們在使用庫中定義的函數、關鍵字時,不在受域限制,我們可以通過自己定義的命名空間來驗證這里的問題,如:
在這里插入圖片描述
在不指定命名空間時程序是無法編譯的,接下來我們展開ltn這個命名空間:
在這里插入圖片描述

#include <stdio.h>
#include <stdlib.h>
namespace ltn
{int rand = 0;int Add(int left, int right){return left + right;}
}
int main()
{Add(1, 1);return 0;
}

對上面個這中情況,我們如果展開命名空間,rand變量就會和庫中的rand()函數沖突,如果不展開每次都要指定域訪問,又有點麻煩,這時我們就可以將
命名空間中我們經常使用的函數、變量具體引,如:
在這里插入圖片描述

還以一點,當我們在兩個不同的文件中,定義了相同的命名空間他們是會自動合并的,例:

namespace ltn
{int add(int x,int y){printf("add\n");return 0}
}

在這里插入圖片描述

在test.h文件中定義一個和test.c相同的命名空間,這是我們只需要將test.c中的命名空間展開test.h命名空間中的add函數一樣可以使用。
在這里插入圖片描述

二、缺省參數

2.1、缺省參數概念

缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實參,則采用該形參的缺省值,否則使用指定的實參。

void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func();     // 沒有傳參時,使用參數的默認值Func(10);   // 傳參時,使用指定的實參
return 0;
}

在這里插入圖片描述

2.2、 缺省參數分類

2.2.1、全缺省參數

void Func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
int main()
{Func();cout <<"-----------------" << endl;Func(1);cout << "-----------------" << endl;Func(1,2);cout << "-----------------" << endl;Func(1,2,3);return 0;
}

在這里插入圖片描述
但我們使用全缺省時,我們可以選擇性給函數傳遞數據。

2.2.2、半缺省參數

void Func(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
int main()
{Func(1);cout << "-----------------" << endl;Func(1,2);cout << "-----------------" << endl;Func(1,2,3);return 0;
}

半缺省函數需要注意的是:

  1. 半缺省參數必須從右往左依次缺省,不能間隔著給
  2. 半缺省參數在調用是,我們傳遞的參數是從左到右依次匹配的

2.3、缺省參數的特點

1、缺省參數不能在函數聲明和定義中同時出現:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
語法規定,當我們對函數進項聲明和定義分離時,缺省參數不可同時存在,如果同時存在,而兩個位置提供的值不同,那編譯器就無法確定到底該用哪個缺省值。
2、 缺省值必須是常量或者全局變量
這個大家自己驗證吧。

三、函數重載

3.1、函數重載概念

函數重載:是函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這些同名函數的形參列表(參數個數 或 類型 或 類型順序)不同,常用來處理實現功能類似數據類型不同的問題

3.2、構成函數重載的條件

構成重載的函數在調用時編譯器會根據我們傳遞的參數,匹配調用合適的函數。

3.2.1、參數類型不同

int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
int main()
{Add(1,1);Add(1.1, 1.2);return 0;
}

在這里插入圖片描述
程序執行時,編譯器自動匹配合適的函數進行調用。

3.2.2、參數個數不同

void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
int main()
{f();f(1);return 0;
}

在這里插入圖片描述
這里要注意的是,我們上面提到的缺省參數如果像下面這樣使用,會造成二義性的問題:
在這里插入圖片描述

3.2.3、參數類型順序不同

需要注意的是,這里說的參數類型順序不同指的是不同類型的參數。

void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
int main()
{f(10, 'a');f('a', 10);return 0;
}

至于c++是如何支持函數重載的,大家感興趣可以搜一下c++中函數名命名規則。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896210.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux提權之計劃任務反彈shell提權(十一)

實驗環境還是一樣的 當獲取一個linux普通用戶的時&#xff0c;查看計劃任務 首先我們退出root用戶 cat /etc/crontab crontab -l 查看當前用戶命令 /var/spool/cron/crontabs/root 這個目錄是root任務文件 默認是不是root權限是 看不到 tail -f /var/log/syslog 咋們切換用…

論文解讀 | AAAI'25 Cobra:多模態擴展的大型語言模型,以實現高效推理

點擊藍字 關注我們 AI TIME歡迎每一位AI愛好者的加入&#xff01; 點擊 閱讀原文 觀看作者講解回放&#xff01; 個人信息 作者&#xff1a;趙晗&#xff0c;浙江大學-西湖大學聯合培養博士生 內容簡介 近年來&#xff0c;在各個領域應用多模態大語言模型&#xff08;MLLMs&…

ai-financial-agent - 為金融投資打造的AI代理

探索人工智能在投資研究中的應用。本項目僅用于**教育**目的&#xff0c;不用于真實交易或投資。 作者聲明&#xff1a; 本項目僅用于教育和研究目的。 不用于真實交易或投資不提供任何保證或擔保過去的表現并不代表未來的結果Creator 對經濟損失不承擔任何責任咨詢財務顧問…

Open WebUI選擇模型為空,解決辦法(for DeepSeek)

標簽&#xff1a; DeepSeek&#xff1b; Open WebUI&#xff1b; 問題&#xff1a;Open WebUI選擇模型為空&#xff0c;解決辦法 &#xff08;for DeepSeek&#xff09; 操作系統&#xff1a;Ubuntu 22 硬件&#xff1a;臺式電腦 Ubuntu 22系統&#xff0c;DeepSeek安裝成功&…

歐幾里得算法第二彈---計算多個數的最大公約數

如果要求多個數的 GCD&#xff0c;可以先求前兩個數的 GCD&#xff0c;然后用這個結果與下一個數求 GCD&#xff0c;依次類推。 為什么可以用前兩個數的 GCD 與下一個數繼續求 GCD&#xff0c;從而得到所有數的 GCD 呢&#xff1f;&#xff08;之前我不知道&#xff0c;自己也沒…

掌握 ElasticSearch 組合查詢:Bool Query 詳解與實踐

掌握 ElasticSearch 組合查詢&#xff1a;Bool Query 詳解與實踐 一、引言 (Introduction)二、Bool 查詢基礎2.1 什么是 Bool 查詢&#xff1f;2.2 Bool 查詢的四種子句2.3 語法結構 三、Bool 查詢的四種子句詳解與示例3.1 must 子句3.2 filter 子句3.3 should 子句3.4 must_no…

【練習】【類似于子集問題】力扣491. 非遞減子序列/遞增子序列

題目 非遞減子序列 給你一個整數數組 nums &#xff0c;找出并返回所有該數組中不同的遞增子序列&#xff0c;遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案。 數組中可能含有重復元素&#xff0c;如出現兩個整數相等&#xff0c;也可以視作遞增序列的一種特殊情況…

本地部署AI模型 --- DeepSeek(二)---更新中

目錄 FAQ 1.Failed to load the model Exit code: 18446744072635812000 FAQ 1.Failed to load the model Exit code: 18446744072635812000 問題描述&#xff1a; &#x1f972; Failed to load the model Error loading model. (Exit code: 18446744072635812000). Unkn…

開源嵌入式實時操作系統uC/OS-II介紹

一、uC/OS-II的誕生&#xff1a;從開源實驗到行業標桿 背景與起源 uC/OS-II&#xff08;Micro-Controller Operating System Version II&#xff09;誕生于1992年&#xff0c;由嵌入式系統先驅Jean J. Labrosse開發。其前身uC/OS&#xff08;1991年&#xff09;最初作為教學工…

Starlink衛星動力學系統仿真建模第七講-衛星姿軌控系統(Attitude and Orbit Control System, AOCS)設計規范

以下是一份衛星姿軌控系統&#xff08;Attitude and Orbit Control System, AOCS&#xff09;設計規范的框架和核心內容示例&#xff0c;供參考&#xff1a; 衛星姿軌控系統&#xff08;AOCS&#xff09;設計規范 1. 總則 1.1 目的 本規范旨在規定衛星姿軌控系統的設計要求、…

C++之旅-C++11的深度剖析(1)

目錄 前言/背景 1.C11的發展歷史 2.列表初始化 2.1 C98傳統的{} 2.2 C11中的{} 2.3 C11中的std::initializer_list 3.右值引用 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延長生命周期 3.4 左值和右值的參數匹配 結束語 前言/背景 隨著現代軟件開發的快速發展…

什么是手機9008模式?如何進入9008

之前給大家分享了一些有關手機刷機的知識&#xff0c;今天給大家講一講如果刷機過程中不慎變磚應該如何應對&#xff08;當然了&#xff0c;希望大家都不會遇到&#xff09;&#x1f602;&#x1f604; 在給手機 Root 或刷機時&#xff0c;線刷 9008 指的是利用 高通 9008 模式…

單機上使用docker搭建minio集群

單機上使用docker搭建minio集群 1.集群安裝1.1前提條件1.2步驟指南1.2.1安裝 Docker 和 Docker Compose&#xff08;如果尚未安裝&#xff09;1.2.2編寫docker-compose文件1.2.3啟動1.2.4訪問 2.使用2.1 mc客戶端安裝2.2創建一個連接2.3簡單使用下 這里在ubuntu上單機安裝一個m…

怎么在Github上readme文件里面怎么插入圖片?

環境&#xff1a; Github 問題描述&#xff1a; 怎么在Github上readme文件里面怎么插入圖片&#xff1f; https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解決方案&#xff1a; 1.相對路徑引用 上傳圖片到倉庫 將圖片文件&#xff08;如 .png/.jpg&#xff…

Elasticsearch除了用作查找以外,還能可以做什么?

前言 Elasticsearch用于實時數據分析、日志存儲、業務智能等。還有日志與監控、多租戶和安全性。以及應用場景包括日志分析、公共數據采集、全文搜索、事件數據、數據可視化。處理錯誤拼寫和支持變體&#xff0c;不過這些可能還是屬于搜索優化。企業搜索、日志管理、應用監控、…

AIGC(生成式AI)試用 22 -- 跟著清華教程學習 - DeepSeek:從入門到精通

目標&#xff1a; 跟著清華教程學習DeepSeek同樣的問題分別嘗試使用DeepSeek和文心一言進行提問嘗試使用輔助工具完成學習中遇到的問題 個人理解&#xff1a; - AI&#xff0c;AI思維&#xff0c;像人一樣思考&#xff0c;越來越像人&#xff1f;參考數據宏大&#xff0c;思考…

[Windows] 全國油價實時查詢,可具體到城市

[Windows] 全國油價實時查詢&#xff0c;可具體到城市 鏈接&#xff1a;https://pan.xunlei.com/s/VOJnS3aOPeBwGaSvS0O0E1hwA1?pwdx83j# 出于代碼練習的目的&#xff0c;調用公共免費api做的py程序&#xff0c;已經一鍵打包&#xff0c;雙擊啟動即可 使用&#xff1a;選擇…

【并發編程】線程池任務拋異常會怎么樣?

一、先說結論 得看線程池的實現&#xff0c;JUC 的線程池&#xff08;ThreadPoolExecutor&#xff09;的話 不會影響其他的線程若是 submit 方法&#xff0c;或者任務為 future 任務&#xff0c;異常只有在 get 的時候才會拋出若是 execute runnable 任務&#xff0c;異常就…

本地部署deepseek-r1 ollama+anythingllm

本期筆者帶給大家部署一個本地私有化知識庫&#xff0c;簡單明了&#xff0c;直接步入主題&#xff0c;需要讀者可以繼續關注支持一下啊&#xff01; 目錄 背景步驟 一、環境準備二、Ollama環境部署三、AnythingLLM安裝 總結 開始下載應用&#xff1a; 操作系統&#xff1a…

JAVA-Exploit編寫(13-15)--JAVAFX-GUI檢測工具編寫實現

目錄 一,JAVAFX-GUI單個漏洞檢測編寫 1.1 綁定事件 1.2 Thinkphp5_Rce編寫 1.3 編寫利用類 1.4 Thinkphp2x_Rce編寫 1.5 單個漏洞檢測GUI工具完整代碼 二,JAVAFX-GUI單個漏洞批量檢測編寫 2.1 編寫利用反射類 2.2 批量檢測漏洞完整GUI工具代碼 三,JAVAFX-GUI…