C++修煉之路:初識C++

????????Hello大家好!很高興我們又見面啦!給生活添點passion,開始今天的編程之路!

我的博客:<但凡.

我的專欄:《編程之路》、《數據結構與算法之美》、《題海拾貝》

歡迎點贊,關注!

引言

?????????C++?,通常被稱為“C加加”,是一種由Bjarne Stroustrup在1983年開發的通用編程語言。它是由C語言擴展升級而來,支持面向對象程序設計、過程化程序設計等多種編程范式。?

????????C++的應用領域服務器端、游戲(引擎)、機器學習引擎、音視頻處理、嵌入式軟件、電信設備、金融 應用、基礎庫、操作系統、編譯器、基礎架構、基礎工具、硬件交互等很多方面都有。

? ? ? ? 本篇文章作為c++基礎教學的第一篇,將帶大家認識和簡單使用c++。


1、C++的第一個程序

? ? ? ? 萬物始于hello world.現在我們來用c++寫一個hello world:

#include<iostream>
using namespace std;
int main()
{cout << "hello world" << endl;return 0;
}

????????我們來分析一下這個程序:首先和C語言一樣,上來先包括一個頭文件。這里我們包過的頭文件是iostream庫,意思是輸入輸出流。里面包含著c++最常用的輸入和輸出

????????接下來一行叫展開命名空間。只有展開的這個明明空間我們的iostream庫里的函數才能隨便使用。當然了至于什么是命名空間以及為什么要展開我們下文再談。

? ? ? ? 下面一行和我們的c語言一樣,都是int main。這里的int main和C語言中的一樣就不過多贅述了。

? ? ? ? 接下來一行是輸出hello world這個字符串。cout是iostream庫中提供的輸出函數。用法就是cout<<輸出內容。后面的endl是換行(endline),但和C語言里面的\n不用,endl是一個函數

2、命名空間

2.1命名空間的定義及使用

? ? ? ? 命名空間namespace存在的意義是為了解決命名沖突。在C語言中實現這個代碼

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

????????會報錯。報錯的原因就是我們自己定的變量rand和C語言自帶的庫函數沖突了。這時候編譯器就無法識別了。這其實是C語言的不足之處。而c++中的命名空間就完美的解決了這個問題。

? ? ? ? 想想一下這個場景。小張和小王同時進行一個項目,但是他倆寫的函數名有時候會相同,不如小張的加法函數叫test,小王的乘法函數叫test,那這時候都不用和系統自帶的函數沖突了,兩個人寫的函數就已經沖突了。這個時候namespace的用處就來了。我們把小張和小王的代碼寫成下面這樣:

#include<iostream>
using namespace std;
namespace mrZhang
{int test(int x, int y){return x + y;}
}
namespace mrWang
{int test(int x, int y){return x * y;}
}
int main()
{int a = mrZhang::test(1, 5);int b = mrWang::test(1, 5);cout << a << " " << b;return 0;
}

輸出一下,分別是6和5,小張和小王的代碼可以毫不沖突的正常使用了。

? ? ? ? 其實命名空間本質上是定義出一個域,我們小張和小王各有一個域,那他們從自己的域里面調用自己的函數不就毫不沖突了嗎?

? ? ? ? 在調用的時候,我們只要用 空間名::函數名 這樣的格式來調用。

????????命名空間還可以進行嵌套,比如這樣:

#include<iostream>
using namespace std;
namespace mrZhang
{int test(int x, int y){return x + y;}namespace mrWang{int test(int x, int y){return x * y;}}}
int main()
{int a = mrZhang::test(1, 5);int b = mrZhang::mrWang::test(1, 5);cout << a << " " << b;return 0;
}

? ? ? ? 輸出結果仍然是6和5。

? ? ? ? 命名空間中不止可以定義函數,也可以定義變量和自定義類型。這樣的話你自己定義的變量也可以和別的同名變量毫不沖突了。

? ? ? ? 另外在多文件中可以定義同名的命名空間。這樣的話他們就會合成一個命名空間。

2.2命名空間的展開

? ? ? ? 現在看我們第一個helloworld程序,第二行的using namespace std;就是展開命名空間。正常我們使用輸入輸出函數是這樣的:

#include<iostream>
int main()
{std::cout << "hello world" << std::endl;return 0;
}

?? ? ? ?當我們程序比較簡單,不會出現沖突的命名的時候就可以把命名空間展開。

? ? ? ? 比如平時的簡單練習程序,或者算法題,我們就可以直接Using namespace std;把命名空間展開直接使用c++自帶的函數。

? ? ? ? 我們也可以只展開一個命名空間中的某個變量或函數,這樣的話訪問這個變量或函數就更簡便了:

#include<iostream>
using namespace std;
namespace mrZhang
{int test(int x, int y){return x + y;}
}
using mrZhang::test;
int main()
{int a = test(1, 5);cout << a;return 0;
}

3、缺省參數

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

? ? ? ? 缺省參數又叫默認參數。

比如我們定義一個這樣的函數:

int test(int x=2, int y=6)
{return x + y;
}

????????我們調用這個函數但是不傳入實參,返回結果就是8.

????????如果再調用時我們傳入實參1和2,那么返回值就是1+2=3。

需要注意三點:

????????1、缺省參數必須從右往左給。比如上面的程序,我們只給x缺省參數但不給y缺省參數這樣其實是不合法的。

? ? ? ? 2、函數實參一定是從左往右給函數的。

? ? ? ? 3、函數聲明和定義分離時,不能在聲明和定義中同時給缺省值。

比如這樣,其實是不合法的:

#include<iostream>
using namespace std;int test(int x = 1, int y = 2);
int main()
{int a = test();cout << a;return 0;
}
int test(int x = 1, int y = 2)
{return x + y;
}

????????我們只能在聲明中給,不能在定義中給。

4、函數重載

? ? ? ? 在c++中允許出現同名函數,但是同名函數的返回值或者形參類型或形參個數必須有一個不同。在調用函數時,c++可以根據傳入實參的類型自動選擇正確的函數。比如這樣:

#include<iostream>
using namespace std;int test(int x , int y )
{return x + y;
}
double test(double x, double y)
{return x + y;
}
int main()
{double x = 1.5, y = 2.8;int a = test(1,2);double b = test(x, y);cout << a <<" "<< b ;return 0;
}

5、引用

5.1引用的介紹

? ? ? ? 引用其實就是給我們已有的一個變量去別名。并不會開辟新的空間。它的使用格式是這樣的:類型&引用別名=引用對象;

? ? ? ? 就像每個人都有大名和乳名一樣,我叫這兩個名字其實指的人都是一個。比如這樣:

int i = 5;
int& j = i;

? ? ? ? 此時我們改變j就相當于改變了i。那這個東西有什么意義呢?回想我們在C語言階段學習指針的時候,交換兩個數的函數得用指針變量做形參。有了引用這個東西,我們就可以這樣寫交換函數

void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}

? ? ? ? 怎么樣,是不是方便了很多呢?

? ? ? ? 其實引用的底層也是指針。所以說通過引用我們能夠改變原值。

5.2引用的特性

? ? ? ? 1、引用必須在定義時初始化。比如int& a=0;這句代碼其實是不合法的。

? ? ? ? 2、一個變量可以有多個引用。

? ? ? ? 3、引用一旦引用一個實體,再不能引用其他實體。

比如下面這串代碼:

#include<iostream>
using namespace std;int main()
{int a = 10;int& b = a;int c = 20;b = c;cout << &a <<" "<< &b <<" "<< &c << endl;cout << a <<" "<< b <<" "<< c << endl;return 0;
}

? ? ? ? 我們進行了b=c的操作,只是把c的值賦值給了b,但并沒有改變b的引用實例,正因此a和b地址是相同的。

5.3引用的使用

????????引用在實踐中主要是于引用傳參和引用做返回值中減少拷貝提高效率和改變引用對象時同時改變被 引用對象。

? ? ? ? 引用傳參我們已經介紹過了,現在我們介紹一下引用做返回值。

int STTop(ST& rs)
{assert(rs.top > 0);return rs.a[rs.top];
}
int main()
{ST st1;STInit(st1);STPush(st1, 1);STPush(st1, 2);STTop(st1)+=10;return 0;
}

? ? ? ? 我們截取了一部分之前棧的操作,發現對于STTop(st1)+=10;這個操作是無法達到目的的。

我們想的是讓棧頂的數據加上10,但是實際上棧頂的數據并沒有改變。

? ? ? ? 這是因為咱們返回的是一個值,相當于我們把原來的數拷貝出了他的值然后返回了,就算把這份拷貝的值加上10也無法改變原來的棧頂數據。而且實際上值的拷貝具有常性,根本就無法改變,導致這個程序報錯。所以從哪個角度來說棧頂數據都無法被更改。

? ? ? ? 但是我們如果是引用返回的話,就可以成功改變棧頂的值,因為我們是直接對棧頂這個區域進行的操作。?

5.4、const引用

? ? ? ? const對象必須用const引用,普通對象也可以用const引用,但普通引用引用不了const對象。? ? ? ?

? ? ? ? 這涉及到權限的問題。普通對象是一個變量,可以被改變的,所以他的權限更低。而const對象不能被改變所以他的權限更高。普通引用引用const對象權限就放大了,所以編譯器會報錯。反過來const引用可以引用普通對象,因為權限是可以縮小的。

6、inline內聯?

? ? ? ? 由于C語言中宏函數設計的不足,c++中inline的誕生就是為了代替宏函數。

#include<iostream>
using namespace std;
inline int add(int x,int y)
{return x + y;
}
int main()
{cout << add(1, 5) << endl;return 0;
}

? ? ? ? 對于短小的函數,inline操作會使函數在編譯時展開,可以提高效率。但是如果這個函數過長就不適合使用內聯了,過長的函數內聯反而會降低時間,甚至,有的編譯器防止用戶內聯過長的函數,就算內聯了,也不會起內聯的作用。

? ? ? ? 注意,內聯函數的定義和聲明必須在同一個文件。

? ? ? ? 好了,今天的內容就分享到這,我們下期再見!

?

?

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

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

相關文章

【STM32MP157系統移植】3.TF-A目錄結構

bl1&#xff1a;部分一般不用TFA自帶的&#xff0c;而是芯片內部的BOOTROM bl2&#xff1a;更像傳統意義的TF-A&#xff0c;TF-A本身 bl31&#xff1a;是ARMV&#xff18;的EL3運行時固件 bl32&#xff1a;OPTEE或者TF-A提供的sp_min bl33&#xff1a;就是uboot 真正需要移…

OpenCV連續數字識別—可運行驗證

前言 ? 文章開始&#xff0c;瞎說一點其他的東西&#xff0c;真的是很離譜&#xff0c;找了至少兩三個小時&#xff0c;就一個簡單的需求&#xff1a; 1、利用OpenCV 在Windows進行抓圖 2、利用OpenCV 進行連續數字的檢測。 3、使用C&#xff0c;Qt 3、將檢測的結果顯示出來 …

shell的模擬實現 ─── linux第16課

在shell的命令行中輸入命令,會有兩種執行命令的途徑 shell自己執行 shell創建子進程(fork ,exit ,waitpid,exec) ,子進程去執行 shell自己執行的命令是自建命令(bulit command) 子進程執行的是非自建命令 第一版只能維護命令行參數表創建子進程, 執行非內建命令 我們先創…

MySQL創建數據庫和表,插入四大名著中的人物

一、登錄數據庫并創建數據庫db_ck 二、創建表t_hero 表屬性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; mysql> create table t_hero(-> id int,-…

靜態網頁的爬蟲(以電影天堂為例)

一、電影天堂的網址&#xff08;url&#xff09; 電影天堂_免費電影_迅雷電影下載_電影天堂網最好的迅雷電影下載網&#xff0c;分享最新電影&#xff0c;高清電影、綜藝、動漫、電視劇等下載&#xff01;https://dydytt.net/index.htm 我們要爬取這個頁面上的內容 二、代碼…

【C++】:STL詳解 —— 紅黑樹封裝map和set

目錄 紅黑樹的源代碼 正向迭代器的代碼 反向迭代器的代碼 set的模擬實現 map的模擬實現 紅黑樹的源代碼 #pragma once #include <iostream>using namespace std; // set ->key // map ->key/value// set ->key // map ->key/valueenum Colour {RED,BLAC…

MATLAB控制函數測試要點剖析

一、功能準確性檢驗 基礎功能核驗 針對常用控制函數&#xff0c;像用于傳遞函數建模的 tf 、構建狀態空間模型的 ss &#xff0c;以及開展階躍響應分析的 step 等&#xff0c;必須確認其能精準執行基礎操作。以 tf 函數為例&#xff0c;在輸入分子與分母系數后&#xff0c;理…

MoonSharp 文檔一

目錄 1.Getting Started 步驟1&#xff1a;在 IDE 中引入 MoonSharp 步驟2&#xff1a;引入命名空間 步驟3&#xff1a;調用腳本 步驟4&#xff1a;運行代碼 2.Keeping a Script around 步驟1&#xff1a;復現前教程所有操作 步驟2&#xff1a;改為創建Script對象 步驟…

ROS云課三分鐘-差動移動機器人導航報告如何撰寫-及格邊緣瘋狂試探

提示詞&#xff1a;基于如上所有案例并結合roslaunch teb_local_planner_tutorials robot_diff_drive_in_stage.launch和上面所有對話內容&#xff0c;設計一個差速移動機器人仿真實驗&#xff0c;并完成報告的全文撰寫。 差速移動機器人導航仿真實驗報告 一、實驗目的 驗證 T…

ACE協議學習1

在多核系統或復雜SoC&#xff08;System on Chip&#xff09;中&#xff0c;不同處理器核心或IP&#xff08;Intellectual Property&#xff09;模塊之間需要保持數據的一致性。常用的是ACE協議or CHI。 先對ACE協議進行學習 ACE協議&#xff08;Advanced Microcontroller Bu…

ajax之生成一個ajax的demo示例

目錄 一. node.js和express ?二. 使用express創建后端服務 三. 創建前端 一. node.js和express ajax是前端在不刷新的情況下訪問后端的技術&#xff0c;所以首先需要配置一個后端服務&#xff0c;可以使用node.js和express。 首先生成一個空項目&#xff0c;新建main目錄…

Java 字節碼操縱框架 -ASM

Java 字節碼操縱框架 -ASM 1.ASM 概述: ASM 是用于 Java 字節碼操縱的框架,可動態生成新類或增強現有類的功能。它既能直接產生二進制 class 文件,也能在類被加載到虛擬機之前動態改變類行為,通過讀取類文件信息來分析、修改類行為,甚至生成新類。許多流行框架如 cglib、…

kafka + flink +mysql 案例

假設你有兩個Kafka主題&#xff1a;user_activities_topic 和 product_views_topic&#xff0c;并且你希望將user_activities_topic中的數據寫入到user_activities表&#xff0c;而將product_views_topic中的數據寫入到product_views表。 maven <dependencies><!-- …

遠程登錄客戶端軟件 CTerm 發布了 v4.0.0

有時候我們需要遠程登錄到 Linux/Unix 服務器&#xff0c;這方面使用最廣泛的客戶端軟件是 PuTTY&#xff0c;不過它是全英文的&#xff0c;而且是單窗口的&#xff0c;有時候顯得不那么方便。 CTerm (Clever Terminal) 是一個 Windows 平臺下支持 Telnet 和 SSH 協議進行遠程…

從李佳琦團隊看新型用工:靈活就業如何重構組織架構?

2022年“雙11”期間&#xff0c;李佳琦直播間累計銷售額突破115億元&#xff08;來源&#xff1a;新腕數據《2022雙11直播電商戰報》&#xff09;&#xff0c;其背后團隊規模約400人&#xff0c;但全職員工僅占35%&#xff0c;其余65%為外包選品團隊、兼職客服、第三方MCN機構人…

微軟程序的打包格式MSIX

MSIX 微軟推出的MSIX格式是其為統一Windows應用程序打包和部署而設計的新一代安裝包格式&#xff0c;具有以下核心特點和進展&#xff1a; 1. 推出背景與時間線 MSIX最初于2018年在微軟Build大會上宣布&#xff0c;并在同年7月發布預覽版打包工具&#xff0c;10月正式版上線…

AFL++安裝

學習fuzzing也幾天了&#xff0c;今天記錄AFL的安裝及使用 一、實驗環境 虛擬機&#xff1a;ubuntu20.04 當然也可以uname -a去看自己的版本號 二、AFL安裝 1.先更新一下工具 sudo apt update2.安裝AFL必要的一些依賴&#xff0c;例如編譯工具&#xff08;如 build-essen…

【STM32】ADC功能-單通道多通道(學習筆記)

本章結合上一節內容復習更好理解【江協科技STM32】ADC數模轉換器-學習筆記-CSDN博客 一、ADC單通道 接線圖 ADC初始化 ①RCC開啟時鐘&#xff0c;包括ADC和GPIO的時鐘&#xff0c;另外ADCCLK的分頻器也要配置 ②配置GPIO,&#xff0c;把需要用的GPIO配置成模擬輸入模式&am…

基于YOLO11深度學習的運動品牌LOGO檢測與識別系統【python源碼+Pyqt5界面+數據集+訓練代碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

當前主流的大模型訓練與推理框架的全面匯總

以下是當前主流的大模型訓練與推理框架的全面匯總 以下是更新后包含 SGLang 的大模型訓練與推理框架列表&#xff0c;并對分類和示例進行了優化&#xff1a; 一、通用深度學習推理框架 TensorRT-LLM 特點&#xff1a;NVIDIA推出的針對Transformer類模型的優化框架&#xff0c;支…