初識C++【命名空間】【輸入輸出】【缺省參數】【函數重載】

前言

C++是一種通用的編程語言,被廣泛用于開發各種應用程序,包括系統軟件、游戲、手機應用和高性能計算等。它是C語言的擴展,添加了許多新特性和功能,并支持面向對象編程。C++可以在不同的平臺上編譯和運行,具有高效性、可移植性和靈活性等特點。它的語法和語義與C語言相似,但還包括了類、模板、異常處理和STL(標準模板庫)等特性。C++是一種強大而靈活的編程語言。簡單的說,C++就是C語言的plus版本,C++的出現就是建立在C語言之上的。

一.命名空間

命名空間(Namespace)是一種組織和管理代碼的方式,它將代碼分組并提供了唯一的標識符(名稱)來引用這些代碼。它的主要作用是避免命名沖突,讓不同模塊或代碼庫中的同名元素能夠被準確地引用。舉個例子:

#include<stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{// 編譯報錯:error C2365: “rand”: 重定義;以前的定義是“函數”printf("%d\n", rand);return 0;
}

如果我把這個代碼放到編譯器里編譯就會出現報錯,說的是我們的rand重定義了。那是因為在頭文件stdlib里我們有rand這個函數。這就是命名沖突了。

1.1namespace的價值

在C/C++中,變量、函數和類都是大量存在的,這些變量、函數和類的名稱都存在于全局作用域中,可能會導致很多沖突。使用命名空間的目的就是對標識符的名稱進行本地化,以避免命名沖突或名字污染,這時在我們的C++里面就引入了一個叫namespace的東西,在東西就可以很好的解決掉命名沖突的問題。

1.2namespace的定義

1.定義命名空間,需要使用到namespace關鍵字,后面跟命名空間的名字,然后接?對{}即可,{}中即為命名空間的成員(值得注意的是在{}后面不加;)。命名空間中可以定義變量/函數/類型等。
就像是這樣:
#include<stdio.h>
#include <stdlib.h>
namespace lwz
{//在命名空間里可以是變量、函數和類型int rand = 10;int Add(int a, int b){return a + b;}struct LNode{int* a;struct LNode* next;};
}
int main()
{// 這里默認是訪問的是全局的rand函數指針printf("%p\n", rand);// 這里指定lwz命名空間中的randprintf("%d\n",lwz::rand);return 0;
}
2.namespace本質是定義出一個域,這個域跟全局域各自獨立,不同的域可以定義同名變量,所以下面的rand不在沖突了。
3.C++中域有函數局部域,全局域,命名空間域,類域;域影響的是編譯時語法查找?個變量/函數/類型出處(聲明或定義)的邏輯,所有有了域隔離,名字沖突就解決了。局部域和全局域除了會影響編譯查找邏輯,還會影響變量的生命周期,命名空間域和類域不影響變量生命周期。
4.namespace只能定義在全局,當然他還可以嵌套定義。
像是這樣:
namespace a
{namespace b{int Add(int x, int y){return x + y;}}namespace c{int Add(int x, int y){return x + y;}}
}
int main()
{printf("%d\n", a::b::Add(1, 2));printf("%d\n", a::c::Add(2, 2));return 0;
}

這里我在命名空間a里嵌套了兩個命名空間b和c,在我們使用的時候,用::就可以訪問命名空間里的東西了。

5.項目工程中多文件中定義的同名namespace會認為是?個namespace,不會沖突。
這句話的意思就是,假如我創建了多個.cpp的文檔,并且我都創建了一個名字為lwz的命名空間,那么在運行的時候,會認為這些文檔里lwz都是一個東西,可以理解為把所有名字為lwz的命名空間都合在一起了。
6.C++標準庫都放在?個叫std(standard)的命名空間中。

1.3命名空間的使用

編譯查找?個變量的聲明/定義時,默認只會在局部或者全局查找,不會到命名空間里面去查找。所以
下?程序會編譯報錯。所以我們要使用命名空間中定義的變量/函數,有三種方式:
? 指定命名空間訪問,項目中推薦這種方式。
這種方式就是上面我一直用到的方式:
namespace lwz
{int a = 0;int b = 10;
}
int main()
{printf("%d\n", lwz::a);printf("%d\n", lwz::b);return 0;
}
? using將命名空間中某個 成員展開,項目中經常訪問的不存在沖突的成員推薦這種方式。
? 展開命名空間中全部成員,項目不推薦,沖突風險很大,日常小練習程序為了方便推薦使用。
展開的方式也可以使用,但是風險很大:
namespace lwz
{int a = 0;int b = 10;
}
using namespace lwz;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

using的作用就是展開我們的命名空間,可以理解為把lwz域里的東西拿到全局域里。當然也可以單獨的把命名空間里的某個特殊成員展開。

namespace lwz
{int a = 0;int b = 10;
}
using lwz::a;
int main()
{printf("%d\n", a);printf("%d\n", lwz::b);return 0;
}

二.輸入輸出

雖然C++是兼容C語言的,但是C++還是有自己的一套輸入輸出。我先簡單的寫一個輸入輸出:

#include<iostream>
using namespace std;
int main()
{int a = 0;double b=0.0;char c = 'a';std::cout << a << " " << b << " " << c <<std::endl;//我們在輸出時可以自動的識別變量的類型cin >> a >> b >> c;//輸入1 2.222 xcout << a << " " << b << " " << c << endl;//輸出1 2.222 xreturn 0;
}
? <iostream> 是 Input Output Stream 的縮寫,是標準的輸入、輸出流庫,定義了標準的輸入、輸 出對象。
? std::cin 是 istream 類的對象,它主要面向窄字符(narrow characters (of type char))的標準輸入 流。
? std::cout 是 ostream 類的對象,它主要面向窄字符的標準輸出流。
? std::endl 是?個函數,流插入輸出時,相當于插入?個換行字符加刷新緩沖區。
? <<是流插入運算符,>>是流提取運算符。(C語言還用這兩個運算符做位運算左移/右移)
? 使?C++輸入輸出更方便,不需要像printf/scanf輸入輸出時那樣,需要手動指定格式,C++的輸入 輸出可以自動識別變量類型(本質是通過函數重載實現的),其實最重要的是 C++的流能更好的支持自定義類型對象的輸入輸出。
? cout/cin/endl等都屬于C++標準庫,C++標準庫都放在?個叫std(standard)的命名空間中,所以要 通過命名空間的使用方式去用他們。
? ?般日常練習中我們可以using namespace std,實際項開發中不建議using namespace std。
? 我們沒有包含<stdio.h>,也可以使printf和scanf,在包含<iostream>間接包含了。vs系列 編譯器是這樣的,其他編譯器可能會報錯。

三.缺省參數

? 缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實參則采用該形參的缺省值,否則使用指定的實參,缺省參數分為全缺省和半缺省參數。(有些地方把缺省參數也叫默認參數)

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

打印出的就是0? 10.

? 全缺省就是全部形參給缺省值,半缺省就是部分形參給缺省值。C++規定半缺省參數必須從右往左依次連續缺省,不能間隔跳躍給缺省值。

#include<iostream>
using namespace std;
void func1(int a=10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
void Func2(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
int main()
{func1();func1(1);func1(1, 2);func1(1, 2, 3);Func2(100);Func2(100, 200);Func2(100, 200,300);return 0;
}

值得注意的是,在半缺省里,函數不可以是void Func2(int a=10, int b, int c = 20)或者void Func2(int a=10, int b, int)。

? 帶缺省參數的函數調用,C++規定必須從左到右依次給實參,不能跳躍給實參。

這里也就剛好對應上面的那一條,半缺省參數必須是從右往左依次連續缺省。

? 函數聲明和定義分離時,缺省參數不能在函數聲明和定義中同時出現,規定必須函數聲明給缺省
值。
這里我來解釋一下這句話,當時我在用C語言實現棧的時候,我把函數的聲明和定義放到了兩個文檔里面。此時的聲明和定義是分離的,在實現棧的初始化的時候,我們可以用一個缺省參數來實現:
首先這是Stack.h文件:
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
void STInit(ST* ps, int n = 4);

此時我們已經在Stack.h文件里已經有了缺省參數,然后是.cpp文件:

#include"Stack.h"
void STInit(ST* ps, int n=10)
{assert(ps && n > 0);ps->a = (STDataType*)malloc(n * sizeof(STDataType));ps->top = 0;ps->capacity = n;
}

如果繼續再函數定義這里還有缺省參數的話,就會導致重定義的問題出現。所以一定要是在函數聲明給缺省值。

四.函數重載

C++支持在同?作用域中出現同名函數,但是要求這些同名函數的形參不同,可以是參數個數不同或者類型不同。這樣C++函數調用就表現出了多態行為,使用更靈活。C語言是不支持同一作用域中出現同名函數的。

4.1參數類型不同

#include <iostream>
#include <assert.h>
using namespace std;
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, 2);Add(1.23, 2.13);return 0;
}

最終打印出“”

4.2參數個數不同

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

最后打印出:

?

4.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;
}

最終打印出:

?

4.4其他情況?

值得注意的是,返回值不同不能作為重載條件,因為調用的時候也無法區分。

包括還有一種情況也會報錯:

void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}

假如我調用的時候沒有參數,編譯器就不知道調用誰。

到這里我簡單的介紹了幾個簡單的C++的語法,也是C++入門必須要知道的東西,如有錯誤還請多多指出,感謝觀看。?

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

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

相關文章

開放式耳機哪個品牌比較好?2024最值得推薦的火爆機型!!

在這個快節奏的時代&#xff0c;我們都在尋找那些既能讓我們享受音樂&#xff0c;又能保持對外界感知的音頻設備。開放式耳機以其獨特的設計&#xff0c;滿足了這一需求&#xff0c;它們讓你在享受音樂的同時&#xff0c;還能聽到周圍環境的聲音&#xff0c;無論是安全出行還是…

華為、H3C、銳捷、思科四大設備廠商交換機配置命令總結合輯

號主&#xff1a;老楊丨11年資深網絡工程師&#xff0c;更多網工提升干貨&#xff0c;請關注公眾號&#xff1a;網絡工程師俱樂部 下午好&#xff0c;我的網工朋友。 一直以來&#xff0c;對于華為、H3C、銳捷、思科交換機的命令配置&#xff0c;不斷的有朋友留言&#xff0c;四…

OpenSNN推文:盛夏智慧之光:七月高校新聞聚焦

隨著夏日的炎炎熱浪逐漸升溫&#xff0c;七月的校園生活也如火如荼地展開。在這個充滿活力的季節里&#xff0c;各大高校不僅迎來了學術交流的高峰&#xff0c;也在科技創新、國際合作等方面取得了顯著成就。以下是本月內幾所知名高校的重要新聞動態&#xff0c;它們不僅展現了…

數據庫 視圖

-- 刪除舊的視圖&#xff08;如果存在&#xff09; DROP VIEW IF EXISTS view_employees_active; -- 創建新的視圖 CREATE VIEW view_employees_active AS SELECT id, name FROM employees WHERE status active; 注意事項 如果視圖不滿足更新條件&#xff08;如包含JOIN、…

譜瑞科技高速傳輸接口芯片選型應用

譜瑞科技股份有限公司為一專供多種普及顯示器以及個人計算機、消費性電子產品與顯示面板所使用之高速訊號傳輸接口標準之混和信號 IC 芯片之領導供貨商。譜瑞公司成立于 2005 年為一無自有晶圓廠之半導體公司&#xff0c;并于 2011 年股票在臺灣柜臺買賣中心正式掛牌交易(股票代…

深入淺出:Scikit-Learn基礎教程

引言 Scikit-Learn&#xff08;簡稱sklearn&#xff09;是Python中一個強大的機器學習庫&#xff0c;提供了豐富的工具和模塊&#xff0c;幫助我們輕松實現數據預處理、模型訓練、評估和預測。本文將通過一個簡單的教程&#xff0c;帶您快速入門Scikit-Learn&#xff0c;掌握其…

Greenplum(三)【分布式事務和兩階段提交協議】

1、事務實現原理和 WAL&#xff08;單機&#xff09; 屬性含義數據庫系統實現Atomic&#xff08;原子性&#xff09;事務中的操作要么全部正確執行&#xff0c;要么完全不執行&#xff08;要么成功、要么失敗&#xff09;Write Ahead Logging 預寫日志&#xff0c;分布式事務&…

C語言希爾排序詳解與實例

希爾排序&#xff08;Shell Sort&#xff09;&#xff0c;是由Donald Shell在1959年提出的一種排序算法。它是插入排序的一種高效改進版&#xff0c;通過引入“增量”概念&#xff0c;將原本的線性查找轉換為分段查找&#xff0c;從而顯著提升了排序效率。本文將深入探討希爾排…

SRC漏洞挖掘技巧:修改返回包的各種姿勢

聽說大家都在要星標&#xff0c;我也要一個吧&#xff0c;可以把我的公眾號打上小星星嗎&#xff1f;~ 又雙叕周一了&#xff0c;還是老樣子&#xff0c;來篇技術向的給大家提提神吧~ 如果你對漏洞挖掘或技術向不感興趣&#xff0c;那么到這就可以了&#xff0c;不用再繼續往下…

【刪庫跑路】一次刪除pip下載的所有第三方庫方法

進入命令行&#xff0c;先list看下庫存 pip list導出所有的第三方庫至一文件列表 pip freeze >requirements.txt按照列表卸載所有庫 pip uninstall -r requirements.txt -y再list看下&#xff0c;可見庫存已清空

1、課程導學(react+區塊鏈實戰)

1、課程導學&#xff08;react區塊鏈實戰&#xff09; 1&#xff0c;課程概述&#xff08;1&#xff09;課程安排&#xff08;2&#xff09;學習前提&#xff08;3&#xff09;講授方式&#xff08;4&#xff09;課程收獲 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符緩沖流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;寫一行行分隔符&#xff0c;行分隔符字符串由系統屬性定義 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;讀一行文字&#xff0c;結果包含行的內容的字…

振動分析-11-軸承數據庫之深度學習一維故障分類Transformer

Pytorch-Transformer軸承故障一維信號分類(三) 1 制作數據集 import pandas as pd filename = "CWRU_1797.csv" df = pd.read_csv(filename)from sklearn.model_selection import train_test_split df_x=df.drop(labels=1024,axis=1)

AI賦能OFFICE 智能化辦公利器!

ONLYOFFICE在線編輯器的最新版本8.1已經發布&#xff0c;整個套件帶來了30多個新功能和432個bug修復。這個文檔編輯器無疑成為了辦公軟件中的翹楚。它不僅支持處理文本文檔、電子表格、演示文稿、可填寫的表單和PDF&#xff0c;還允許多人在線協作&#xff0c;并支持AI集成&…

java Pair怎么使用

文章目錄 1. 簡介2. Pair類的來源3. 如何使用Pair類4. Pair類的實際應用5. Pair類的優點和缺點 1. 簡介 什么是Pair Pair是一個通用的數據結構&#xff0c;用于存儲一對關聯的對象&#xff0c;也就是兩個元素。這兩個元素可以是任何類型&#xff0c;并且它們之間沒有特定的層次…

哪些獨立站外鏈策略最有效?

在當前的SEO領域中&#xff0c;獨立站外鏈策略的效果差異很大&#xff0c;但GPB外鏈無疑是其中最為有效的一種。GPB外鏈&#xff0c;指的是通過高質量、包收錄且dofollow的頂級域名獨立站來獲得外鏈&#xff0c;這種外鏈策略能夠顯著提升目標網站的整體排名數據。 關鍵詞排名的…

redis學習(007 實戰:黑馬點評:登錄)

黑馬程序員Redis入門到實戰教程&#xff0c;深度透析redis底層原理redis分布式鎖企業解決方案黑馬點評實戰項目 總時長 42:48:00 共175P 此文章包含第25p-第p34的內容 文章目錄 短信登錄功能session 共享問題 短信登錄功能 接口編寫 這里是Result的封裝 過濾器在攔截器的外層…

go語言的堆排序實現

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、intheap的堆排序接口二、節點的堆排序實現三、leetcode 23. 合并 K 個升序鏈表 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、in…

淘寶詳情的 API 探秘:獲取與運用全攻略

在電商領域&#xff0c;淘寶無疑是一座巨大的寶庫&#xff0c;其中豐富的商品詳情信息對于商家、開發者和數據分析人員來說具有極高的價值。而通過 API 接口來獲取淘寶詳情&#xff0c;則為我們打開了一扇高效獲取這些信息的大門。 一、為什么要獲取淘寶詳情 首先&#xff0c;…

嵌入式系統中的實時操作系統任務調度策略

嵌入式系統中的實時操作系統任務調度策略 在嵌入式系統中&#xff0c;實時任務調度是確保系統響應性和穩定性的關鍵方面之一。不同的任務調度策略可以影響系統的性能和實時性。本文將深入探討兩種常見的實時任務調度策略&#xff1a;固定優先級調度和循環時間片調度&#xff0…