即使走的再遠(yuǎn),也勿忘啟程時(shí)的初心
C/C++ 游戲開發(fā)
Hello,米娜桑們,這里是君兮_,數(shù)據(jù)結(jié)構(gòu)和算法初階更新完畢,我們繼續(xù)來擴(kuò)充我們的知識(shí)面,今天我們從認(rèn)識(shí)C++開始來帶大家學(xué)習(xí)C++,我之前看過一套書叫做《明朝那些事兒》,把本來枯燥的歷史講的生動(dòng)有趣。而C++作為一門接近底層的語言,無疑是抽象且難度頗深的。我希望能努力把抽象繁多的知識(shí)講的生動(dòng)又通俗易懂,因此,咱們這個(gè)講解C++的系列博客就叫做《C++那些事兒》啦
-
好了廢話不多說,開始我們今天的學(xué)習(xí)吧?。?/font>
先導(dǎo):什么是C++?
說到C++,我們很多人都聽過它的頂頂大名,C++也常年霸占著市面上程序員使用的編程語言前五的位置,足以說明它的重要性和被認(rèn)可度,那么說到底,什么是C++呢?
-
C語言是結(jié)構(gòu)化和模塊化的語言,適合處理較小規(guī)模的程序。對(duì)于復(fù)雜的問題,規(guī)模較大的
程序,需要高度的抽象和建模時(shí),C語言則不合適。為了解決軟件危機(jī), 20世紀(jì)80年代, 計(jì)算機(jī)
界提出了OOP(object oriented programming:面向?qū)ο?思想,支持面向?qū)ο蟮某绦蛟O(shè)計(jì)語言
應(yīng)運(yùn)而生。 -
1982年,Bjarne Stroustrup博士(C++祖師爺)在C語言的基礎(chǔ)上引入并擴(kuò)充了面向?qū)ο?/strong>的概念,發(fā)明了一種新的程序語言。為了表達(dá)該語言與C語言的淵源關(guān)系,命名為C++。因此:C++是基于C語言而產(chǎn)生的,它既可以進(jìn)行C語言的過程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對(duì)象的程序設(shè)計(jì),還可以進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)
說到底,就是咱們的祖師爺在自己使用C語言的時(shí)候,發(fā)現(xiàn)了許多C語言的不足和缺陷,這讓祖師爺在用的時(shí)候非常的不爽,因此自己著手在C語言的基礎(chǔ)上又開發(fā)了一門新的語言C++,他的語言他做主,他就在自己的語言中補(bǔ)足了C的缺陷和那些在使用時(shí)讓人不爽的地方,C++應(yīng)運(yùn)而生,后來在經(jīng)過不斷的發(fā)展遞進(jìn),不段引入新的標(biāo)準(zhǔn)和特性,就到了目前我們電腦中的C++啦!
C++在工作領(lǐng)域中的應(yīng)用
-
1. 操作系統(tǒng)以及大型系統(tǒng)軟件開發(fā)
所有操作系統(tǒng)幾乎都是C/C++寫的,許多大型軟件背后幾乎都是C++寫的,比如:
Photoshop、Office、JVM(Java虛擬機(jī))等,究其原因還是性能高,可以直接操控硬件。 -
2. 服務(wù)器端開發(fā)
后臺(tái)開發(fā):主要側(cè)重于業(yè)務(wù)邏輯的處理,即對(duì)于前端請(qǐng)求后端給出對(duì)應(yīng)的響應(yīng),現(xiàn)在主流采
用java,但內(nèi)卷化比較嚴(yán)重,大廠可能會(huì)有C++后臺(tái)開發(fā),主要做一些基礎(chǔ)組件,中間件、
緩存、分布式存儲(chǔ)等。服務(wù)器端開發(fā)比后臺(tái)開發(fā)跟廣泛,包含后臺(tái)開發(fā),一般對(duì)實(shí)時(shí)性要求
比較高的,比如游戲服務(wù)器、流媒體服務(wù)器、網(wǎng)絡(luò)通訊等都采用C++開發(fā)的。 -
3. 游戲開發(fā)
PC平臺(tái)幾乎所有的游戲都是C++寫的,比如:魔獸世界、傳奇、CS、跑跑卡丁車等,市面上
相當(dāng)多的游戲引擎都是基于C++開發(fā)的,比如:Cocos2d、虛幻4、DirectX等。三維游戲領(lǐng)
域計(jì)算量非常龐大,底層的數(shù)學(xué)全都是矩陣變換,想要畫面精美、內(nèi)容豐富、游戲?qū)崟r(shí)性
搞,這些高難度需求無疑只能選C++語言。比較知名廠商:騰訊、網(wǎng)易、完美世界、巨人網(wǎng)
絡(luò)等。 -
4. 嵌入式和物聯(lián)網(wǎng)領(lǐng)域
嵌入式:就是把具有計(jì)算能力的主控板嵌入到機(jī)器裝置或者電子裝置的內(nèi)部,能夠控制這些
裝置。比如:智能手環(huán)、攝像頭、掃地機(jī)器人、智能音響等。
談到嵌入式開發(fā),大家最能想到的就是單片機(jī)開發(fā)(即在8位、16位或者32位單片機(jī)產(chǎn)品或者
裸機(jī)上進(jìn)行的開發(fā)),嵌入式開發(fā)除了單片機(jī)開發(fā)以外,還包含在soc片上、系統(tǒng)層面、驅(qū)動(dòng)
層面以及應(yīng)用、中間件層面的開發(fā)。
常見的崗位有:嵌入式開發(fā)工程師、驅(qū)動(dòng)開發(fā)工程師、系統(tǒng)開發(fā)工程師、Linux開發(fā)工程
師、固件開發(fā)工程師等。
知名的一些廠商,比如:以華為、vivo、oppo、小米為代表的手機(jī)廠;以紫光展銳、樂鑫為
代表的芯片廠;以大疆、??低?、大華、CVTE等具有自己終端業(yè)務(wù)廠商;以及海爾、海
信、格力等傳統(tǒng)家電行業(yè)。
隨著5G的普及,物聯(lián)網(wǎng)(即萬物互聯(lián),)也成為了一種新興勢(shì)力,比如:阿里lot、騰訊lot、京
東、百度、美團(tuán)等都有硬件相關(guān)的事業(yè)部。 -
5. 數(shù)字圖像處理
數(shù)字圖像處理中涉及到大量數(shù)學(xué)矩陣方面的運(yùn)算,對(duì)CPU算力要求比較高,主要的圖像處理
算法庫(kù)和開源庫(kù)等都是C/C++寫的,比如:OpenCV、OpenGL等,大名鼎鼎的Photoshop
就是C++寫的。 -
6. 人工智能
一提到人工智能,大家首先想到的就是python,認(rèn)為學(xué)習(xí)人工智能就要學(xué)習(xí)python,這個(gè)
是誤區(qū),python中庫(kù)比較豐富,使用python可以快速搭建神經(jīng)網(wǎng)絡(luò)、填入?yún)?shù)導(dǎo)入數(shù)據(jù)就
可以開始訓(xùn)練模型了。但人工智能背后深度學(xué)習(xí)算法等核心還是用C++寫的。 -
7. 分布式應(yīng)用
近年來移動(dòng)互聯(lián)網(wǎng)的興起,各應(yīng)用數(shù)據(jù)量業(yè)務(wù)量不斷攀升;后端架構(gòu)要不斷提高性能和并發(fā)
能力才能應(yīng)對(duì)大信息時(shí)代的來臨。在分布式領(lǐng)域,好些分布式框架、文件系統(tǒng)、中間組件等
都是C++開發(fā)的。對(duì)分布式計(jì)算影響極大的Hadoop生態(tài)的幾個(gè)重量級(jí)組件:HDFS、
zookeeper、HBase等,也都是基于Google用C++實(shí)現(xiàn)的GFS、Chubby、BigTable。包括分
布式計(jì)算框架MapReduce也是Google先用C++實(shí)現(xiàn)了一套,之后才有開源的java版本。
除了上述領(lǐng)域外,科學(xué)計(jì)算、瀏覽器、流媒體開發(fā)、網(wǎng)絡(luò)軟件等都是C++比較適合的場(chǎng)景,
作為一名老牌語言的常青樹,C++一直霸占編程語言前5名,肯定有其存在的價(jià)值
怎樣學(xué)習(xí)C++呢?
- 這里有一套21天精通C++的秘籍供大家參考:
- C++缺點(diǎn)之一,是相對(duì)許多語言復(fù)雜,而且難學(xué)難精。因此想要在短暫的時(shí)間說精通它是基本不可能的,甚至說,目前敢自稱精通C++的大佬,估計(jì)除了那些開發(fā)編譯器和新語言的,少之又少。
- 因此,在這里,我給大家的建議是不要把「精通C++」作為一個(gè)一年目標(biāo),應(yīng)該要把學(xué)習(xí)語言作為一個(gè)持續(xù)的過程,同時(shí)把語言運(yùn)用在具體的應(yīng)用場(chǎng)合中,你想做到任何有挑戰(zhàn)的事物,持之以恒是你最好的選擇??!
好了,講了這么多有關(guān)對(duì)C++的內(nèi)容,不知道你是否準(zhǔn)備好正式開始進(jìn)入C++的學(xué)習(xí)呢?無論你準(zhǔn)備沒準(zhǔn)備好,別想那么多,現(xiàn)在, Just Do it,不做你就不可能有進(jìn)步,深吸一口氣,開始我們正式的C++學(xué)習(xí)吧!!
一.命名空間
- 不知道你是否遇到這種情況,當(dāng)你在使用C語言的過程中,定義一個(gè)函數(shù)或變量時(shí),編輯器提示你該函數(shù)或變量已存在
- 在C語言中,是無法解決這樣的命名問題的,而為了解決命名沖突的問題,C++中提出了命名空間的概念
什么是命名空間
- 在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存
在于全局作用域中,可能會(huì)導(dǎo)致很多沖突。使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,
以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對(duì)這種問題的
命名空間的定義
- 定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可,{}
中即為命名空間的成員。
#include<iostream>
namespace junxi
{
int rand = 10;
}
int main()
{
printf("%d\n", rand);//在這里這是錯(cuò)誤的用法,別急,在使用命名空間是會(huì)講
return 0;
}
在以后的工作和項(xiàng)目開發(fā)中,往往是多人協(xié)作的,為了防止和別的命名空間沖突,這里的命名空間建議寫成自己的名字的縮寫,當(dāng)然其他的也行,你自己認(rèn)得出來就沒啥問題。
- 在定義的命名空間中,除了變量以外,還可以定義函數(shù),結(jié)構(gòu)體等等,
此外,命名空間是支持嵌套的,也就是允許在命名空間中在定義一個(gè)命名空間。
最后,在同一個(gè)工程中允許存在多個(gè)相同名稱的命名空間,編譯器最后會(huì)合成同一個(gè)命名空間中,在實(shí)際的開發(fā)中,這種方法不常用就是了。
namespace junxi
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
namespace Junxi//嵌套
{
}
struct Node
{
struct Node* next;
int val;
};
}
//同一工程中相同的命名空間最后會(huì)合并
namespace junxi
{
int a = 0;
int b = 0;
}
int main()
{
printf("%d\n", rand);
return 0;
}
- 注意:
- 1.千萬不要把主函數(shù)寫在一個(gè)命名空間中,我們知道,每一個(gè)工程中都需要一個(gè)主函數(shù),如果你把主函數(shù)寫在一個(gè)命名空間中又不使用它,這個(gè)工程中就是沒有主函數(shù)的!!
- 2.一個(gè)命名空間就定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中
命名空間的使用
- 回顧我們剛才的這段代碼,我在上面說了,在打印rand的時(shí)候是有錯(cuò)誤的
- 當(dāng)我們打印時(shí),會(huì)出現(xiàn)隨機(jī)數(shù),這是為什么呢?
- 因?yàn)閞and在命名空間中,我們要想使用一個(gè)命名空間中的成員就得像下面這樣:
命名空間的三種使用方式
- 1.加命名空間名稱及作用域限定符
int main()
{
printf("%d\n", junxi::rand);
return 0;
}
- 2.使用using將命名空間中某個(gè)成員引入
using junxi::a;
int main()
{
printf("%d\n", a);
return 0;
}
- 3.使用using namespace 命名空間名稱引入
using namespace junxi;
int main()
{
printf("%d\n", a);
return 0;
}
- 如果你仔細(xì)觀察會(huì)發(fā)現(xiàn),我這里2,3這兩種命名空間的使用時(shí)沒有打印rand,這是為什么呢?
- 注意:
- 并不是說在C++中就完全解決了C語言中函數(shù)重定義的問題,當(dāng)我們遇到以下情況時(shí),仍然會(huì)報(bào)錯(cuò):
- 第一種情況
namespace junxi
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
namespace Junxi
{
}
struct Node
{
struct Node* next;
int val;
};
}
using junxi::rand;
int main()
{
printf("%d\n", rand);
return 0;
}
- 第二種情況
using namespace junxi;
int main()
{
printf("%d\n", rand);
return 0;
}
- 此時(shí),你雖然引用了命名空間或者指出了對(duì)應(yīng)命名空間中的成員,但是由于庫(kù)中存在rand這個(gè)函數(shù),你在打印時(shí)沒有明確指出到底是哪個(gè)是要打印的,編譯器就無法編譯不明確的代碼,因此,如果你在實(shí)際編程開發(fā)中遇到上面這種情況,建議使用第一種使用命名空間成員的辦法??!
二. C++中的輸入和輸出
- 我們很多人學(xué)習(xí)編程語言的一個(gè)輸入往往是“hello world”,那么,我們?cè)鯓佑肅++對(duì)這個(gè)美好的世界進(jìn)行問候呢?
#include<iostream>
// std是C++標(biāo)準(zhǔn)庫(kù)的命名空間名,C++將標(biāo)準(zhǔn)庫(kù)的定義實(shí)現(xiàn)都放到這個(gè)命名空間中(類似于我們C語言中的stdio)
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;//輸出
return 0;
}
- 具體說明
-
1. 使用 cout標(biāo)準(zhǔn)輸出對(duì)象(控制臺(tái)) 和 cin標(biāo)準(zhǔn)輸入對(duì)象(鍵盤) 時(shí),必須包含< iostream >頭文件
以及按命名空間使用方法使用std。 -
2. cout和cin是全局的流對(duì)象,endl是特殊的C++符號(hào),表示換行輸出,他們都包含在包含<
iostream >頭文件中。 - 3. <<是流插入運(yùn)算符,>>是流提取運(yùn)算符。
- 4. 使用C++輸入輸出更方便,不需要像printf/scanf輸入輸出時(shí)那樣,需要手動(dòng)控制格式。C++的輸入輸出可以自動(dòng)識(shí)別變量類型
#include <iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
// 可以自動(dòng)識(shí)別變量的類型
cin >> a;
cin >> b >> c;//輸入數(shù)回車結(jié)束 先輸入到b中,再輸入到c中
cout << a << endl;
cout << b << " " << c << endl;//從左到右打印
return 0;
}
- 這里這么多<< 和 >>很多初學(xué)的同學(xué)可能會(huì)分不清,那么我教大家一個(gè)能快速記住的小寄巧
- <<流插入運(yùn)算符,你把它當(dāng)作水流,也就是把你要輸入的內(nèi)容流入cout,cout就幫你把里面的內(nèi)容輸出到控制臺(tái)上,也就是打印啦!
- >>流提取運(yùn)算符,cin從鍵盤上讀取到數(shù)據(jù)后,流出>>到你想要它到的地方,是不是就是輸入啦!
- 也就是說,看這倆運(yùn)算符的指向,就能很輕易的幫我們分辨出到底是輸入還是輸出
- 很多人,看到這里可能會(huì)有這樣的疑問,那在日常使用時(shí),怎樣用cout和cin控制整形進(jìn)制格式或者浮點(diǎn)數(shù)輸出精度呢?
cout和cin當(dāng)然可以幫我們達(dá)到這樣的目標(biāo),對(duì)應(yīng)初學(xué)者來說,使用cout和cin控制輸入輸出是比較麻煩的,因此,我們就不在這里展開學(xué)習(xí)了。如果你真的在使用過程中遇到類似的需要,別忘了C++是兼容C的哦!我們可以用C的方法實(shí)現(xiàn)嘛
三.缺省函數(shù)
- 什么是缺省函數(shù)呢?
- 缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)
參則采用該形參的缺省值,否則使用指定的實(shí)參
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 沒有傳參時(shí),使用參數(shù)的默認(rèn)值
Func(10); // 傳參時(shí),使用指定的實(shí)參
return 0;
}
缺省函數(shù)的分類
- 上面的例子,我們的函數(shù)只有一個(gè)傳入的參數(shù),當(dāng)傳入多個(gè)參數(shù)時(shí),我們的缺省函數(shù)就存在不同的種類了
- 全缺省函數(shù)
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
-
即每一個(gè)傳入的參數(shù)都有一個(gè)缺省值的函數(shù),我們視為全缺省函數(shù)
-
半缺省函數(shù)
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
注意:
1. 半缺省參數(shù)必須從右往左依次來給出,不能間隔著給
2. 缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn),往往是出現(xiàn)在聲明中
3. 缺省值必須是常量或者全局變量
4. C語言不支持缺省函數(shù)(編譯器不支持)
- 下面我來對(duì)上述的前兩點(diǎn)注意進(jìn)行一下解釋
- 第一點(diǎn) 為什么必須從左到右不能間隔給呢?
void Func(int c, int a = 0, int d )
{
cout << c << endl;
cout << a << endl;
cout << d << endl;
}
int main()
{
Func(10); // 傳參時(shí),使用指定的實(shí)參
return 0;
}
- 如果出現(xiàn)上面這種情況,我們只傳入了一個(gè)參數(shù),那么,請(qǐng)問,這個(gè)參數(shù)到底是賦給c還是賦給d呢?只有你知道,而咱們的編譯器是不知道的,因此必須按順序設(shè)置缺省參數(shù)的值
- 第二點(diǎn),為什么不能在函數(shù)的聲明和定義中同時(shí)出現(xiàn)?
//a.h 在頭文件中
void Func(int a = 10);
// a.cpp //具體實(shí)現(xiàn)時(shí)的定義
void Func(int a = 20)
{}
- 如果出現(xiàn)以上的情況,當(dāng)聲明與定義你給的缺省參數(shù)是不同的,那么編譯器在運(yùn)行程序時(shí)到底是以誰為準(zhǔn)呢?同時(shí),正常來說,也不能只在定義中給,因?yàn)槿绻阍谑褂媚硞€(gè)函數(shù)時(shí)只引用了它對(duì)應(yīng)的頭文件,在聲明中是不存在缺省參數(shù)的,你實(shí)際在使用該函數(shù)時(shí)就是沒有缺省參數(shù)的。因此,在我們的日常使用中,最好是在聲明中使用缺省函數(shù)。
總結(jié)
-
好啦,我們今天的內(nèi)容就先到這里啦!今天我們主要介紹了C++中命名空間,輸入輸出和缺省函數(shù)的概念使用以及注意事項(xiàng),俗話說心急吃不了熱豆腐,正如我前面所說,學(xué)習(xí)C++不是一朝一夕的事情,只有不斷的積累和反復(fù)的練習(xí)才能幫你攀上C++這座高峰。
-
有任何的問題和對(duì)文章內(nèi)容的疑惑歡迎在評(píng)論區(qū)中提出,當(dāng)然也可以私信我,我會(huì)在第一時(shí)間回復(fù)的!!
新人博主創(chuàng)作不易,如果感覺文章內(nèi)容對(duì)你有所幫助的話不妨三連一下再走唄。你們的支持就是我更新的動(dòng)力?。?!
**(可莉請(qǐng)求你們?nèi)B支持一下博主?。?!點(diǎn)擊下方評(píng)論點(diǎn)贊收藏幫幫可莉吧)** 文章來源:http://www.zghlxwxcb.cn/news/detail-712953.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-712953.html
到了這里,關(guān)于【C++那些事兒】初識(shí)C++ 命名空間,C++中的輸入輸出以及缺省函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!