初識C++ | 基本介紹、命名空間、輸入輸出、缺省函數、函數重載、引用、內聯函數、nullptr

基本介紹

C++的起源

1979年,當時的 Bjarne Stroustrup 正在?爾實驗室從事計算機科學和軟件?程的研究?作。?對項?中復雜的軟件開 發任務,特別是模擬和操作系統的開發?作,他感受到了現有語?(如C語?)在表達能?、可維護性 和可擴展性??的不?。
于是,牛逼的祖師爺決定自己創造語言!
1983年,Bjarne Stroustrup 在C語?的基礎上 添加了 ?向對象編程 的特性,設計出了C++語?的雛形, 此時的C++已經有了類、封裝、繼承等核?概念,為后來的?向對象編程奠定了基礎。這?年該語?被正式命名為C++。

重點:C++祖師爺——Bjarne Stroustrup

? ? ? ? ? ?C++——在C語?的基礎上產生的

? ? ? ? ? ? ? ? ? ? ? ? ?可以進行C語言的過程化程序設計

? ? ? ? ? ? ? ? ? ? ? ? 可以進行以抽象數據類型為特點的基于對象的程序設計

? ? ? ? ? ? ? ? ? ? ? ? 可以進行面向對象的程序設計

C++的發展

時間:1998年

階段:C++98

內容:第一個版本發布,絕大多數編譯器都支持,得到了國際標準化組織(ISO)和美國標準化協會認可,以模板方式重寫?C++?標準庫,引入了?STL?(標準模板庫)。

時間:2011年

階段:C++11

內容:增加了許多特性,使得?C++?更像一種新語言,比如:正則表達式、基于范圍for循環、auto關鍵字、新容器、列表初始化、標準線程庫等

時間:2020年

階段:C++11

內容:?引入了許多新的特性,比如:模塊(Modules)、協程(Coroutines)、范圍(Ranges)、概念(Constraints)等重大特性,還有對已有特性的更新:比如Lambda支持模板、范圍for支持初始化等

目前主要實用標準為?C++98?和?C++11

命名空間

產生背景:在C/C++中,變量、函數和后?要學到的類都是?量存在的,這些變量、函數和類的名稱將都存在于全局作?域中,可能會導致很多沖突。
目的:對標識符的名稱進?本地化,以避免命名沖突。

#include <iostream>
using namespace std;
namespace ONE {int n = 3;
}namespace TWO {int n = 4;
}int main() {cout << ONE::n << endl;cout << TWO::n << endl;return 0;
}

命名空間的定義

定義命名空間,需要使?到namespace關鍵字,后?跟命名空間的名字,然后接?對{}即可,{}中
即為命名空間的成員。命名空間中可以定義變量/函數/類型等。
namespace 關鍵字{//內容——可以定義變量/函數/類型等
}

? namespace本質是定義出?個域,這個域跟全局域各?獨?,不同的域可以定義同名變量。
? C++中域有函數局部域全局域命名空間域類域
域影響的是編譯時語法查找?個變量/函數/ 類型出處(聲明或定義)的邏輯,所有有了域隔離,名字沖突就解決了。
局部域和全局域除了會影響編譯查找邏輯,還會影響變量的聲明周期
命名空間域類域不影響變量聲明周期
? namespace只能定義在全局,當然他還可以嵌套定義
#include <iostream>
using namespace std;
namespace ONE{int n = 3;namespace TWO {int n = 4;}
}int main() {cout << ONE::n << endl;cout << ONE::TWO::n << endl;return 0;
}

? 項??程中多?件中定義的同名namespace會認為是?個namespace,不會沖突。
? C++標準庫都放在?個叫std(standard)的命名空間中。

命名空間的使用

一共有三種方法:

方法一:指定命名空間訪問(推薦)

 // 指定命名空間訪問
#include <iostream>
using namespace std;
namespace ONE{int n = 3;
}int main() {cout << ONE::n << endl;return 0;
}
方法二:using將命名空間中某個成員展開(項?中經常訪問的不存在沖突的成員推薦)
//using將命名空間中某個成員展開
#include <iostream>
using namespace std;
namespace ONE{int n = 3;
}
using ONE::n;
int main() {cout << n << endl;return 0;
}
方法三:展開命名空間中全部成員(沖突風險大,項目中不推薦)
//展開命名空間中全部成員
#include <iostream>
using namespace std;
namespace ONE{int n = 3;
}
using namespace ONE;
int main() {cout << n << endl;return 0;
}

輸入輸出

<iostream> 是 Input Output Stream 的縮寫,是標準的輸?、輸出流庫,定義了標準的輸?、輸
出對象。
? cout/cin/endl等都屬于C++標準庫,C++標準庫都放在?個叫std(standard)的命名空間中,所以要 通過命名空間的使??式去?他們。
? std::cin 是 istream 類的對象,它主要?向窄字符的標準輸?流。
? std::cout 是 ostream 類的對象,它主要?向窄字符的標準輸出流。
? std::endl 是?個函數,流插?輸出時,相當于插??個換?字符加刷新緩沖區。
? <<流插?運算符>>流提取運算符
#include <iostream>
using namespace std;int n = 3;int main() {cout << n << endl;//此處endl寫成'/n'也是同樣的效果return 0;
}
使用C++輸入輸出的優勢
? 更?便,可以?動識別變量類型,不需要像printf/scanf輸?輸出時那樣,需要?動指定格式。
? C++的流能更好的?持?定義類型對象的輸?輸出。

缺省函數

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

? 全缺省就是全部形參給缺省值

? 半缺省就是部分形參給缺省值。(不是一半哦)

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

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

#include <iostream>
using namespace std;
//全缺省
void Print1(int a = 1, int b = 2) {cout<<"全缺省"<< endl;cout <<a<<endl;cout <<b<< endl;}
//半缺省
void Print2(int a , int b ,int c=3) {cout << "半缺省" << endl;cout <<a<< endl;cout <<b<< endl;cout <<c<< endl;
}int main() {//全缺省——不給參數Print1();//全缺省——給參數Print1(4, 5);//半缺省——給必要參數Print2(1,2);//半缺省——給所有參數Print2(1, 2, 4);return 0;
}
? 函數聲明和定義分離時,缺省參數不能在函數聲明和定義中同時出現,規定必須函數聲明給缺省
值。

函數重載

C++?持在同?作?域中出現同名函數,但是要求這些同名函數的形參不同,可以是參數個數不同或者類型不同
注意:返回值不同不能作為重載條件,因為調?時也?法區分。
#include <iostream>
using namespace std;void func(int a) {cout << a << endl;
}void func(int a,int b) {cout << a<<b << endl;
}void func(double a) {cout << a  << endl;
}int main() {func(1);func(1, 2);func(1.1111);return 0;
}

引用

引用的概念

引?不是新定義?個變量,?是給已存在變量取了?個別名,編譯器不會為引?變量開辟內存空間,它和它引?的變量共?同?塊內存空間。
引用的底層仍然是指針!
類型& 引?別名 = 引?對象;
#include<iostream>
using namespace std;int main()
{
int a = 0;
// 引?:b和c是a的別名
int& b = a;
int& c = a;
// 也可以給別名b取別名,d相當于還是a的別名
int& d = b;
++d;
// 這?取地址我們看到是?樣的
cout << &a << endl;cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;}

引用的特性

? 引?在定義時必須 初始化??
? ?個變量可以有多個引?(土豆有很多個別名:洋芋、馬鈴薯)
? 引??旦引??個實體,再不能引?其他實體(洋芋只能是土豆的別名,不能再成為其它蔬菜的別名)
這一點注意與指針區分開!

引用的使用

? 引?在實踐中主要是于引?傳參引?做返回值中減少拷?提?效率和改變引?對象時同時改變被 引?對象。
1. 引?傳參
引?傳參指針傳參功能是類似的,引?傳參相對更?便?些。
#include<iostream>
using namespace std;
//引用傳參
void Swap(int& rx, int& ry){int tmp = rx;rx = ry;ry = tmp;}int main(){int x = 0, y = 1;cout << x << " " << y << endl;Swap(x, y);cout << x << " " << y << endl;return 0;}
2.做返回值
int arr[5] = { 0 };//全局變量int& func(int n) {return arr[n];
}int main() {cout << arr[4] << endl;func(4)=1;//改變了arr[4]的值為1cout << arr[4] << endl;return 0;
}

const引用

可以引??個const對象,但是必須?const引?const引?也可以引?普通對象
原因:因為對象的訪問權限引?過程中 可以縮? ,但是 不能放?
注意 :類似 int& rb = a*3; double d = 12.34; int& rd = d; 這樣?些場景下a*3的和結果保存在?個臨時對象中, int& rd = d 也是類似,在類型轉換中會產?臨時對象存儲中間值,也就是時,rb和rd引?的都是臨時對象,?C++規定臨時對象具有常性,所以這? 就觸發了權限放?,必須要?const引?才可以。
?(臨時對象:編譯器需要?個空間暫存表達式的求值結果時臨時創建的?個未命名的對象)

指針和引用的關系

C++中指針和引?就像兩個性格迥異的親兄弟,指針是哥哥,引?是弟弟,在實踐中他們相輔相成,功 能有重疊性,但是各有??的特點,互相不可替代。
引用指針
開不開空間?不開
初始化?必須初始化建議初始化,但不必須
改變對象?引??個對象后,不能再引?其他對象可以改變指向對象
訪問對象?可以直接訪問需要解引?
sizeof中含義引?類型的??
地址空間所占字節個數(32位平臺下 占4個字節,64位下是8byte)
安全性更安全空指針和野指針的問題

內聯函數

?inline修飾的函數叫做內聯函數
nline int Add(int x, int y)
{return x + y;
}
? inline對于編譯器??只是?個建議。
也就是說,你加了inline編譯器也可以選擇在調?的地?不展開,不同編譯器關于inline什么情況展開各不相同,因為C++標準沒有規定這個。inline適?于頻繁調用的短小函數,對于遞歸函數,代碼相對多?些的函數,加上inline也會被編譯器忽略。
想象一下,假如一個內聯函數內有100條語句:
沒有展開:
call:相當于跳轉,跳轉到函數的地址
展開:
? C++設計了inline?的就是替代C的宏函數
C語?實現宏函數也會在預處理時替換展開,但是宏函數實現很復雜很容易出錯的,且不?便調試
#define ADD(x, y) ((x) + (y))	//通過宏函數實現ADD,復雜易錯

? inline不建議聲明和定義分離到兩個?件,分離會導致鏈接錯誤。因為inline被展開,就沒有函數地址,鏈接時會出現報錯。

內聯函數特點:

  • 在?Debug?模式下,函數不會進行替換,可以進行調試
  • 在?Realse?模式下,函數會像宏函數一樣展開,提高程序運行速度
  • 內聯函數彌補了宏函數的不足,同時吸收了宏函數速度快的優點

補充:

vs編譯器 debug版本下?默認是不展開inline的,這樣?便調試,debug版本想展開需要設置?下
以下兩個地?。

nullptr

NULL實際是?個宏,在傳統的C頭?件(stddef.h)中,可以看到如下代碼:
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif#endif
由此可見,C++中NULL被定義為字?常量0,而非void*。
為了修復這一漏洞, ? C++11中引?nullptr。
nullptr是?個特殊的關鍵字,nullptr是?種特殊類型的字?量,它可以轉換 成任意其他類型的指針類型。使?nullptr定義空指針可以避免類型轉換的問題,因為nullptr只能被 隱式地轉換為指針類型,?不能被轉換為整數類型。

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

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

相關文章

無法定位程序輸入點kernel32.dll ——一鍵修復丟失kernel32.dll方案

無法定位程序輸入點" 錯誤通常發生在 Windows 操作系統中&#xff0c;當一個程序試圖加載一個 DLL&#xff08;動態鏈接庫&#xff09;文件中的特定函數&#xff0c;但無法找到該函數的入口點時。kernel32.dll 是 Windows 操作系統中的一個關鍵 DLL 文件&#xff0c;它包含…

Backyard二指夾爪硬件安裝與軟件配置

一、背景 每次要用機械臂做實驗時&#xff0c;都要重新配置好一會&#xff0c;尤其這個Backyard二指夾爪&#xff0c;各種連接線和外接電源。雖然很麻煩&#xff0c;但理清思路后&#xff0c;10分鐘就可以搞定。所以說腦力勞動的效率永遠大于體力勞動&#xff0c;要多想&#…

HiFi音頻pro和普通HiFi音頻

針對那些對音質要求極高、追求專業級音頻表現的用戶&#xff0c;音頻設備公司專門設計了HiFi 音頻Pro系列。它們在設計和性能上更為精細和高級&#xff0c;當然價格通常也會反映其高端定位和專業水準。相比之下&#xff0c;普通HiFi音頻設備雖然也能提供良好的音質&#xff0c;…

設置DepthBufferBits和設置DepthStencilFormat的區別

1&#xff09;設置DepthBufferBits和設置DepthStencilFormat的區別 2&#xff09;Unity打包exe后&#xff0c;游戲內拉不起Steam的內購 3&#xff09;Unity 2022以上Profiler.FlushMemoryCounters耗時要怎么關掉 4&#xff09;用GoodSky資產包如何實現晝夜播發不同音樂功能 這是…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-第十八章 Linux編寫第一個自己的命令

i.MX8MM處理器采用了先進的14LPCFinFET工藝&#xff0c;提供更快的速度和更高的電源效率;四核Cortex-A53&#xff0c;單核Cortex-M4&#xff0c;多達五個內核 &#xff0c;主頻高達1.8GHz&#xff0c;2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…

Python-找客戶軟件

軟件功能 請求代碼&#xff1a; 填充表格&#xff1a; 可以search全國各個區縣的所有企業信息&#xff0c;過濾手機號、查看是否續存/在業狀態。方便找客戶。 支持定-制-其他引-留-阮*件&#xff08;XHSS&#xff0c;DYY&#xff0c;KS&#xff0c;Bi-li*Bi-li&#xff09; V*…

AutoHotKey自動熱鍵(八)腳本快速暫停與重新加載

我們在編輯腳本的時候,可以添加快捷鍵來改變腳本的狀態 ;暫停腳本 F11::Suspend;重置腳本 F12::Reloadreload用來重置腳本 我們可以在腳本開頭加上標簽提示腳本重啟成功 ToolTip, 腳本已經重啟 Sleep, 1000 ToolTip第二個ToolTip是用來關閉提示器用的 這個提示功能一定要寫…

oracle dba常用腳本2

11、表空間實有、現有、使用情況查詢對比 SELECT TABLESPACE_NAME 表空間,TO_CHAR(ROUND(BYTES / 1024, 2), 99990.00) || 實有,TO_CHAR(ROUND(FREE / 1024, 2), 99990.00) || G 現有,TO_CHAR(ROUND((BYTES - FREE) / 1024, 2), 99990.00) || G 使用,TO_CHAR(ROUND(10000 * US…

【開源合規】開源許可證風險場景詳細解讀

文章目錄 前言關于BlackDuck許可證風險對比圖弱互惠型許可證舉個例子具體示例LGPL系列LGPL-2.0-onlyLGPL-2.0-or-laterLGPL-2.1-onlyLGPL-2.1-or-laterLGPL-3.0-onlyLGPL-3.0-or-laterMPL系列MPL-1.0MPL-1.1MPL-2.0EPL系列EPL-1.0EPL-2.0互惠型許可證GPL系列GPL-1.0GPL-2.0GPL-…

常用錄屏軟件,分享這四款寶藏軟件!

在數字化時代&#xff0c;錄屏軟件已經成為我們日常工作、學習和娛樂中不可或缺的工具。無論你是需要錄制教學視頻、游戲過程&#xff0c;還是進行產品演示&#xff0c;一款高效、易用的錄屏軟件都能讓你的工作事半功倍。今天&#xff0c;就為大家揭秘四款寶藏級錄屏軟件&#…

重磅|九科信息完成諾輝領投的B1輪融資,累計融資已達億級

近日&#xff0c;九科信息宣布B1輪融資順利完成。本輪由深圳諾輝嶺南投資管理有限公司領投&#xff0c;深創投索斯福&#xff08;深圳&#xff09;私募創業投資基金跟投。 截至本輪&#xff0c;九科信息累計融資達億級。但真正讓九科人驕傲的&#xff0c;并非融資本身&#xff…

無法找到模塊“@wangeditor/editor-for-vue”的聲明文件

vue3項目中使用wangeditor/editor遇到的問題 開發環境不管紅線報錯正常使用 打包的時候就會報錯了 1.安裝依賴 pnpm install --save wangeditor/editor wangeditor/editor-for-vuenext 2.遇到的問題 3.解決方法 在src目錄下面創建 wangeditor-types.d.ts 文件 代碼如下 de…

IEC62056標準體系簡介-6.IEC62056標準體系的特點

相對于其它常用的計量儀表通信協議&#xff0c;如IEC1107、IEC 62056-31、IEC 60870-5-102以及北美使用的通信協議ANSI C12.18&#xff08;光口&#xff09;、C12.19&#xff08;公用表&#xff09;和C12.21&#xff08;電話通信&#xff09;和國內使用的DL/T645等&#xff0c;…

The First項目報告:創新型金融生態Lista DAO

一、Lista DAO是什么&#xff1f; LISTA是Lista DAO的原生加密協議代幣&#xff0c;設計為一種可互操作的實用代幣&#xff0c;旨在促進去中心化金融&#xff08;DeFi&#xff09;領域內的支付、治理與激勵。LISTA的誕生源于Lista DAO項目&#xff0c;該項目是一個基于BNB鏈的…

springboot3 集成GraalVM

目錄 安裝GraalVM 配置環境變量 Pom.xml 配置 build包 測試 安裝GraalVM Download GraalVM 版本和JDK需要自己選擇 配置環境變量 Jave_home 和 path 設置setting.xml <profile><id>graalvm-ce-dev</id><repositories><repository><id&…

2024最新版pycharm安裝激火教程,附安裝包+激huo馬,Python教程,pycharm安裝包!!

PyCharm的安裝 PyCharm 是一個專門為 Python 開發者設計的 IDE&#xff0c;它同樣具有代碼導航、重構、調試和分析等功能。PyCharm 支持多種項目類型&#xff0c;如普通項目、Python 測試項目、Django 項目等&#xff0c;并提供了大量的內置模板和插件&#xff0c;以幫助您更快…

【隨筆】浮生若夢

【傳承】 這樣算起來&#xff0c;人一生的故事都好像在傳承&#xff0c;生兒育女&#xff0c;傳承自己的希望&#xff1b;桃李天下&#xff0c;傳承自己的思想&#xff1b;維護國家疆土&#xff0c;傳承大國的文化。 如果每天照著鏡子&#xff0c;會看到自己慢慢老去&#xff0…

elementui實現復雜表單的實踐

簡介 文章主要講述在vue3項目中使用elementui框架實現復雜表單的方式。表單中涉及動態組件的生成、文件上傳和富文本編輯器的使用&#xff0c;只會將在實現過程中較復雜的部分進行分享&#xff0c;然后提供一份完整的前端代碼。 表單效果演示 基礎信息 spu屬性 sku詳情 關鍵…

字符串s構造前綴樹,并判斷p是否屬于s的子串

文章目錄 1、描述2、notes3、code 1、描述 根據幾個單詞&#xff0c;構造一個前綴樹&#xff0c;再給定一個單詞p,判斷p是否屬于s的前綴 輸入&#xff1a;vec {“hello”, “world”, “hey”, “hi”} p “hell” 輸入&#xff1a;yes 2、notes 就直接構造 3、code #in…

編程語言如何和計算機交互:深入解析交互機制

編程語言如何和計算機交互&#xff1a;深入解析交互機制 在數字化世界的深處&#xff0c;編程語言與計算機之間的交互是構建數字邏輯、實現功能需求的基石。這一過程既充滿神秘&#xff0c;又充滿力量。那么&#xff0c;編程語言究竟是如何與計算機進行交互的呢&#xff1f;本…