C++初探究

概述

C++可以追溯到1979年,C++之父Bjarne Stroustrup在在使用C語言研發工作時發現C語言的不足,并想要將其改進,到1983年,Bjarne Stroustrup在C語言的基礎上添加了面向對象編程的特性,設計出了C++的雛形。

網址推薦

C++官方文檔(英文):cppreference.com

C++官方文檔(中文):C++ 參考手冊 - cppreference.com

C++函數查詢:Reference - C++ Reference

C++程序

C++兼容C的絕大多數語法,所以我們仍可以在C++文件中使用printf函數

#include <stdio.h>	int main()
{printf("hello world");return 0;}

類似于C的#include <stdio.h>,C++中也有一個標準庫. 我們想要調用就要用:#include <iostream>,所以,嚴格來說用C++寫出的printf函數應該是這樣寫的:
?

#include<iostream>
using namespace std;//命名沖突->命名空間
int main()
{cout << "hello world" << endl;return 0;
}

接下來,我們一一講解代碼中的元素.

當需要多人完成一個項目時,若兩人用了相同的變量名,但變量的值卻不同該怎么辦?

namespace命名空間

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

? ? ? ? 2.namespace本質是定義出?個域,這個域跟全局域各?獨?,不同的域可以定義同名變量,所以下?的rand不在沖突了。

? ? ? ? 3.C++中域有函數局部域,全局域,命名空間域,類域;域影響的是編譯時語法查找?個變量/函數/類型出處(聲明或定義)的邏輯,所有有了域隔離,名字沖突就解決了。局部域和全局域除了會影響編譯查找邏輯,還會影響變量的聲明周期,命名空間域和類域不影響變量聲明周期。

? ? ? ? 4.namespace只能定義在全局,當然他還可以嵌套定義。

? ? ? ? 5.項??程中多?件中定義的同名namespace會認為是?個namespace,不會沖突。

? ? ? ? 6.C++標準庫都放在?個叫std(standard)的命名空間中。

namespace的使用

如果寫出這樣的代碼:

int main(){int rand = 10;//編譯報錯:error C2365: “rand”: 重定義;以前的定義是“函數”printf("%p\n", rand);//查找是編譯進行的return 0;
}

會出現重定義報錯

所以我們使用命名空間:

//“ ::”域作用限定符,不寫即為先從全局開始查找,也可以寫具體的域
namespace Frenemy
{int rand = 10;
}
int main(){//編譯報錯:error C2365: “rand”: 重定義;以前的定義是“函數”printf("%d\n", Frenemy::rand);//查找是編譯進行的return 0;
}

其中“ ::”域作用限定符,不寫即為先從全局開始查找,也可以寫具體的域,并且命名空間必須寫在全局變量中.

而對于多個文件中的相同的命名空間,C++會直接將其合并.

若在一個項目中,已經使用了一次命名空間,但仍有兩人使用相同變量又該怎么辦呢?

namespace的嵌套調用

在同一個命名空間中,假如有兩人ab與xy,我們就可以使用嵌套定義:

namespace Frenemy
{namespace ab{int rand = 1;}namespace xy{int rand = 2;}

我們如果要使用命名空間的值,例如ab里的rand,則使用Frenemy::ab::rand即可

namespace的展開

全部展開:使用using Frenemy(namespace)?

部分展開(只展開一個變量):使用using Frenemy(namespace)::ab::rand.要使用時直接調用rand變量即可.

對于標準庫函數standard(簡稱std), 每次寫語句時都要使用std::cout<<a<<std::endl;較為麻煩,所以對于平時小練習可以將標準庫函數直接展開.

C++輸入輸出

????????<iostream> 是 Input Output Stream 的縮寫,是標準的輸?、輸出流庫,定義了標準的輸?、輸出對象。

????????
????????std::cin 是 istream 類的對象,它主要?向窄字符(narrow characters (of type char))的標準輸?流。


????????std::cout 是 ostream 類的對象,它主要?向窄字符的標準輸出流。


????????std::endl 是?個函數,流插?輸出時,相當于插??個換?字符加刷新緩沖區。


????????<<是流插?運算符,>>是流提取運算符。(C語?還?這兩個運算符做位運算左移/右移)

????????C++一行可以輸入輸出多個字符和字符串,并且可以自動識別多種類型

c語言中的printf在C++中就相當于輸出函數cout.

int main()
{printf("hello world!\n");cout << "hello world!" << endl;return 0;
}//這兩者是同一效果

缺省參數

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

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


????????函數聲明和定義分離時,缺省參數不能在函數聲明和定義中同時出現,規定必須函數聲明給缺省值。

全缺省參數

全部形參給缺省值,例如:

// 全缺省
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;
}

半參省參數的規定是從右向左給形參賦值,也不能跳著給.

函數重載

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

參數類型不同

????????相同函數名的函數其形參類型不同則為函數重載,例如:

// 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;
}
參數個數不同

? ? ? ? 相同函數名的函數其形參個數不同則為函數重載,例如:

// 2、參數個數不同
void f(int a, int b)
{cout << "f(int a, int b)" << endl;
}void f(int a)
{cout << "f(int a)" << endl;
}
參數類型順序不同?

????????相同函數名的函數其形參順序不同則為函數重載,例如

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;
}
注意?

? ? ? ? 1.需要注意的是,返回值不同并不能說明兩函數為函數重載,因為函數返回值可以不被調用;如果其中一個沒有返回值,而另一個有,當需要返回值時也無法區分 .

? ? ? ? 2.下列函數f()調用時會報錯,因為編譯器不知道執行哪一個!

// 下?兩個函數構成重載
// f()但是調?時,會報錯,存在歧義,編譯器不知道調?誰
void f1()
{cout << "f()" << endl;
}void f1(int a = 10)
{cout << "f(int a)" << endl;
}

引用

?????????引?不是新定義?個變量,?是給已存在變量取了?個別名,編譯器不會為引?變量開辟內存空間,它和它引?的變量共?同?塊內存空間。我們可以粗淺的將其理解為沒有開辟新空間的指針.

引用的特性

? ? ? ? 1.引?在定義時必須初始化


? ? ? ? 2.?個變量可以有多個引用


? ? ? ? 3.引??旦引??個實體,再不能引?其他實體

例如

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

相當于為變量取外號?.

例如我們熟悉的Swap函數,用指針寫是這樣:

void Swap(int* rx, int* ry)
{int tmp = *rx;*rx = *ry;*ry = tmp;
}

用引用寫是這樣:

void Swap(int& rx, int& ry)
{int tmp = rx;rx = ry;ry = tmp;
}

看起來確實簡潔一點, 這些就是引用的一些基礎知識。

總結

學會這幾個知識點,我們就可以理解開篇的那個函數代表了什么意思了。

C++中許多新語法的提出,其實也就是Bjarne Stroustrup對C語言一些語法的不滿并對其進行的改造。我們可以發現,這幾個知識點確實對應著C語言語法里一些較為不方便的地方。

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

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

相關文章

Docker:WARNING: Published ports are discarded when using host network mode 解決方法

在Docker中&#xff0c;使用主機網絡模式&#xff08;host network mode&#xff09;時&#xff0c;容器將共享主機的網絡命名空間&#xff0c;這意味著容器將直接使用主機的網絡接口和端口。因此&#xff0c;當你嘗試通過Docker的發布端口功能&#xff08;publish a port&…

如何在uniapp中使用websocket?

websocket是我們經常使用到的接口,通常用于即時通訊以及K線圖這種需要實時更新數據的業務需求上,傳統的restful接口雖然可以滿足,但是你需要輪詢,這就要額外寫一堆代碼,不是很方便,用websocket就簡單很多,我們來看代碼 第一步定義全局常量、變量 const config = {host…

ActiViz實戰:ActiViz實現體繪制裁剪

文章目錄 效果預覽關鍵代碼源碼地址效果預覽 ActiViz體繪制裁剪 關鍵代碼 1、實現體繪制 FolderBrowserDialog folderDialog = new FolderBrowserDialog(); folderDialog.SelectedPath = "E:\\S100"; string

王老師 linux c++ 通信架構 筆記(三)安裝 xftp、

&#xff08;11&#xff09;調整 xshell 終端的字體大小&#xff0c;默認字體大小是 9 &#xff1a; &#xff08;12&#xff09; 共享文件夾 hgfs 的含義&#xff1a; &#xff08;13&#xff09;安裝 xftp &#xff0c; 傻瓜式安裝&#xff0c;出了修改下默認安裝位置。 操作…

.locked勒索病毒解析與防護指南

引言 隨著信息技術的飛速發展&#xff0c;網絡安全問題日益嚴峻&#xff0c;其中勒索病毒成為威脅企業和個人數據安全的重要隱患之一。在眾多勒索病毒家族中&#xff0c;.locked勒索病毒以其獨特的加密方式和廣泛的傳播途徑&#xff0c;引起了廣泛的關注。本文將從多個方面詳細…

使用redis-cli查找大key

執行命令 涉及redis-cli 連接和登錄&#xff0c;請查看&#xff1a;Redis-cli 連接Redis-CSDN博客 redis-cli -h <redis_instance_address> -p <port> -a <password> --bigkeys<redis_instance_address>&#xff1a; Redis 實例的 IP 地址。 <p…

opencv 魚眼圖像的矯正(動態參數調整)

一&#xff1a;棋盤校準參數說明(內參) 棋盤校準的方法及代碼很多&#xff0c;參見其他連接 1&#xff1a;內參矩陣 2&#xff1a;畸變系數 針對魚眼相機此處是4個參數&#xff0c;在其校準代碼中也可以知道&#xff0c;其通常的定義如下&#xff1a; data.camera_mat np.e…

報修小程序論文(設計)開題報告

一、課題的背景和意義 近些年來&#xff0c;隨著移動互聯網巔峰時期的來臨&#xff0c;互聯網產業逐漸趨于“小、輕、微”的方向發展&#xff0c;符合輕應用時代特點的各類技術受到了不同領域的廣泛關注。在諸多產品中&#xff0c;被譽為“運行著程序的網站”之名的微信小程序…

uniapp-小程序獲取用戶位置

1. 需要在微信公眾平臺進行接口的申請。選擇自己需要用的接口。 2. 在app.json文件中配置permission和requiredPrivateInfos。requiredPrivateInfos里面是你需要使用的接口。 3. 配置完成后&#xff0c;就可以使用了。 相關獲取位置API的鏈接 4. 如果要獲取當前位置到某一個指…

【在 OpenResty 中使用 Lua 獲取服務器自身的 IP 地址】

要在 OpenResty 中使用 Lua 獲取服務器自身的 IP 地址&#xff0c;可以使用 Lua 結合系統命令來獲取本地網絡接口的 IP 地址。以下是一個示例&#xff0c;展示如何實現這一點&#xff1a; 修改你的 nginx.conf 文件&#xff0c;添加一個新的 location 塊來處理獲取本地 IP 地址…

java順序表的實現

一&#xff0c;前言 hello大家好呀&#xff0c;今天淺略講講java的順序表&#xff0c;其實順序表大概一個月前就學了&#xff0c;但是由于前段時間期末一直沒寫博客&#xff0c;但是現在想想其實期末我還是有很多空余時間的&#xff0c;但是由于自己的原因耽誤了很多時間現在想…

C++面向對象的常見面試題目(二)

1. 繼承關系下&#xff0c;析構函數和構造函數執行順序&#xff1f; 構造函數按照依賴鏈&#xff0c;從強到弱構造 首先調用基類的構造函數。如果有多個基類&#xff0c;則按照它們在派生類聲明中出現的順序調用&#xff1b;接下來&#xff0c;按照它們在類中聲明的順序&…

windows USB 設備驅動開發-處理批傳輸的靜態流

在 USB 2.0 和更早版本的設備中&#xff0c;批量端點可以通過該端點發送或接收單個數據流。 在 USB 3.0 設備中&#xff0c;批量端點能夠通過該端點發送和接收多個數據流。 Windows 中 Microsoft 提供的 USB 驅動程序堆棧支持多個流。 這使客戶端驅動程序能夠將獨立的 I/O 請求…

GEE代碼實例教程詳解:長時間序列風速分析

簡介 在本篇博客中&#xff0c;我們將使用Google Earth Engine (GEE) 對長時間序列的風速數據進行分析。通過ERA5再分析數據集&#xff0c;我們可以計算2010年至2024年間的平均風速&#xff0c;并與1980年至2020年的風速數據進行比較。 背景知識 ERA5數據集 ERA5是ECMWF&am…

代碼隨想錄-Day53

739. 每日溫度 給定一個整數數組 temperatures &#xff0c;表示每天的溫度&#xff0c;返回一個數組 answer &#xff0c;其中 answer[i] 是指對于第 i 天&#xff0c;下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高&#xff0c;請在該位置用 0 來代替。 示例 1: …

【Linux】目錄的相關命令——cd,pwd,mkdir,rmdir

1.相對路徑與絕對路徑 在開始目錄的切換之前&#xff0c;你必須要先了解一下所謂的路徑&#xff08;PATH)&#xff0c;有趣的是&#xff1a;什么是相對路 與絕對路徑&#xff1f; 絕對路徑&#xff1a;路徑的寫法“一定由根目錄/寫起”&#xff0c;例如&#xff1a;/usr/shar…

Java版Flink使用指南——定制RabbitMQ數據源的序列化器

大綱 新建工程新增依賴數據對象序列化器接入數據源 測試修改Slot個數打包、提交、運行 工程代碼 在《Java版Flink使用指南——從RabbitMQ中隊列中接入消息流》一文中&#xff0c;我們從RabbitMQ隊列中讀取了字符串型數據。如果我們希望讀取的數據被自動化轉換為一個對象&#x…

Linux C++ 043-機房預約系統

Linux C 043-機房預約系統 本節關鍵字&#xff1a;Linux、C、機房預約系統 相關庫函數&#xff1a;for_each、open、close、write 系統簡介 學校現在有幾個規格不同的機房&#xff0c;由于使用經常出現撞車現象&#xff0c;現開發一套機房預約系統&#xff0c;解決這一問題。…

Java進階---抽象方法abstract

抽象方法 案例引入: 在某個寵物店的寵物資源管理系統中有&#xff1a; 狗類&#xff1a;屬性&#xff08;姓名&#xff09;&#xff0c;行為&#xff08;吃飯&#xff09; 貓類&#xff1a;屬性&#xff08;姓名&#xff09;&#xff0c;行為&#xff08;吃飯&#xff09;利用…

智慧科技照亮水利未來:深入剖析智慧水利解決方案如何助力水利行業實現高效、精準、可持續的管理

目錄 一、智慧水利的概念與內涵 二、智慧水利解決方案的核心要素 1. 物聯網技術&#xff1a;構建全面感知網絡 2. 大數據與云計算&#xff1a;實現數據高效處理與存儲 3. GIS與三維可視化&#xff1a;提升決策支持能力 4. 人工智能與機器學習&#xff1a;驅動決策智能化 …