柚子快報(bào)邀請(qǐng)碼778899分享:【C++】入門基礎(chǔ)知識(shí)-1
??個(gè)人主頁(yè):Yanni.—
?數(shù)據(jù)結(jié)構(gòu):Data Structure.??????
?C語言筆記:C Language Notes
?OJ題分享:?Topic Sharing
?C++詳解:C++ in detail
目錄
前言:
C++關(guān)鍵字
命名空間?
命名空間介紹
命名空間的使用
C++的輸入和輸出?
cout 輸出
cin 輸入
std命名空間的使用慣例
缺省參數(shù)
缺省參數(shù)概念
缺省參數(shù)分類
函數(shù)重載
函數(shù)重載概念
為什么c語言不支持重載
前言:
企業(yè)中面試中一般需要面向?qū)ο蟮膬煞N主流語言C++和Java,現(xiàn)在java崗位雖然多,但是內(nèi)卷嚴(yán)重,經(jīng)過很長(zhǎng)時(shí)間的思考,還是選擇了C++,可能以后還會(huì)進(jìn)入游戲開發(fā)的領(lǐng)域,這恰恰是我感興趣的,C++前期的基礎(chǔ)知識(shí)很難,但是過了這道難關(guān)之后情況會(huì)越來越來。Let's go!
C++關(guān)鍵字
C++
總計(jì)
63
個(gè)關(guān)鍵字,
C
語言
32
個(gè)關(guān)鍵字。
這里在C語言的基礎(chǔ)上增加了許多關(guān)鍵字。
命名空間?
命名空間介紹
在
C/C++
中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存
在于全局作用域中,可能會(huì)導(dǎo)致很多沖突。使用命名空間的目的是
對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化
,
以
避免命名沖突或名字污染
,
namespace
關(guān)鍵字的出現(xiàn)就是針對(duì)這種問題的。
#include
#include
int rand = 10;
int main()
{
printf("%d", rand);
return 0;
}
我們直到rand產(chǎn)生隨機(jī)值,但是我們給出了一個(gè)全局變量rand,并且賦值了給它。這就導(dǎo)致:
?“rand”: 重定義;以前的定義是“函數(shù)”。所以我們得避免命名沖突或名字污染。
命名沖突主要有兩個(gè):
1.庫(kù)沖突
2.項(xiàng)目間,同時(shí)工作交接之間的互相命名沖突
因此定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可,{} 中即為命名空間的成員。
#include
#include
namespace Yanni
{
int rand = 10;
}
int main()
{
printf("%d", Yanni::rand);
return 0;
}
命名空間的三個(gè)特性:
1.命名空間中可以定義變量/函數(shù)/類型。
2.命名空間可以嵌套。
3.同一個(gè)工程中是允許多種同名稱的命名空間存在,編譯器最后會(huì)成同一個(gè)命名空間內(nèi)。
命名空間的使用
命名空間的使用主要有三種方式
1.加命名空間名稱及作用域限定符
namespace Yanni // 命名空間名
{
int r = 10;
}
int main()
{
printf("%d", Yanni::r);
return 0;
}
2.使用using將命名空間中某個(gè)成員引入
namespace Yanni
{
int r = 10;
}
using Yanni::r;
int main()
{
printf("%d",r);
return 0;
}
這個(gè)操作就想是將命名空間里的特定成員變成全局訪問。?
?3.使用 using namespace 命名空間名稱引入
namespace Yanni
{
int r = 10;
}
using namespace Yanni;
int main()
{
printf("%d",r);
return 0;
}
這就是將命名空間內(nèi)的所有成員變成全局訪問。
C++的輸入和輸出?
cout 輸出
#include
//std是C++標(biāo)準(zhǔn)庫(kù)的命名空間名,C++將標(biāo)準(zhǔn)庫(kù)的定義都放到這個(gè)命名空間中。
using namespace std;
int main()
{
cout << "hello world" << endl;//endl相當(dāng)與換行符
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),表示換行輸出,他們都包含在包含
3.
<<
是流插入運(yùn)算符,
>>
是流提取運(yùn)算符
。
4.
使用
C++
輸入輸出更方便,不需要像
printf/scanf
輸入輸出時(shí)那樣,需要手動(dòng)控制格式。 C++的輸入輸出可以自動(dòng)識(shí)別變量類型。
5.
實(shí)際上
cout
和
cin
分別是
ostream
和
istream
類型的對(duì)象,
>>
和
<<
也涉及運(yùn)算符重載等知識(shí), 這些知識(shí)我們我們后續(xù)才會(huì)學(xué)習(xí),所以我們這里只是簡(jiǎn)單學(xué)習(xí)他們的使用。后面我們還有有 一個(gè)章節(jié)更深入的學(xué)習(xí)IO
流用法及原理。
注意:早期標(biāo)準(zhǔn)庫(kù)將所有功能在全局域中實(shí)現(xiàn),聲明在
.h
后綴的頭文件中,使用時(shí)只需包含對(duì)應(yīng)
頭文件即可,后來將其實(shí)現(xiàn)在
std
命名空間下,為了和
C
頭文件區(qū)分,也為了正確使用命名空間,
規(guī)定
C++
頭文件不帶
.h
;舊編譯器
(vc 6.0)
中還支持
格式,后續(xù)編譯器已不支持,因
此
推薦
使用
的方式。
cin 輸入
在c語言中,我們定義變量都需要對(duì)變量進(jìn)行初始化,而在C++中,就不需要初始化了,因?yàn)閏in>>可以自動(dòng)識(shí)別變量類型。
#include
//std是C++標(biāo)準(zhǔn)庫(kù)的命名空間名,C++將標(biāo)準(zhǔn)庫(kù)的定義都放到這個(gè)命名空間中。
using namespace std;
int main()
{
int a;
double b;
char c;
cin >> a;
cin >> b >> c;
cout << a << b << c << endl;
return 0;
}
std命名空間的使用慣例
std
是
C++
標(biāo)準(zhǔn)庫(kù)的命名空間,如何展開
std
使用更合理呢?
1.
在日常練習(xí)中,建議直接
using namespace std
即可,這樣就很方便。
2. using namespace std
展開,標(biāo)準(zhǔn)庫(kù)就全部暴露出來了,如果我們定義跟庫(kù)重名的類型
/
對(duì) 象/
函數(shù),就存在沖突問題。該問題在日常練習(xí)中很少出現(xiàn),但是項(xiàng)目開發(fā)中代碼較多、規(guī)模 大,就很容易出現(xiàn)。所以建議在項(xiàng)目開發(fā)中使用,像std::cout
這樣使用時(shí)指定命名空間
+ using std::cout展開常用的庫(kù)對(duì)象
/
類型等方式。
缺省參數(shù)
缺省參數(shù)概念
缺省參數(shù)是
聲明或定義函數(shù)時(shí)
為函數(shù)的
參數(shù)指定一個(gè)缺省值
。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)
參則采用該形參的缺省值,否則使用指定的實(shí)參。
using namespace std;
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func();沒有傳參時(shí),使用參數(shù)的默認(rèn)值
Func(10);傳參時(shí),使用限定的實(shí)參
}
缺省參數(shù)分類
全缺省參數(shù)
void Func(int a = 0,int b = 10,int c = 20)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
半缺省參數(shù)
void Func(int a, int b = 10, int c = 20)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
這里要注意的是:
1.半缺省參數(shù)必須從右往左依次來給出,不能間隔著給(傳參的順序的從左到右)
2.缺省參數(shù)不能再函數(shù)聲明和定義中同時(shí)出現(xiàn)
3.缺省值必須是常量或者全局變量
4.c語言編譯器不支持
函數(shù)重載
自然語言中,一個(gè)詞可以有多重含義,人們可以通過上下文來判斷該詞真實(shí)的含義,即該詞被重
載了。
比如:以前有一個(gè)笑話,國(guó)有兩個(gè)體育項(xiàng)目大家根本不用看,也不用擔(dān)心。一個(gè)是乒乓球,一個(gè)
是男足。前者是
“
誰也贏不了!
”
,后者是
“
誰也贏不了“。
函數(shù)重載概念
函數(shù)重載:
是函數(shù)的一種特殊情況,
C++
允許在
同一作用域中
聲明幾個(gè)功能類似
的同名函數(shù)
,這
些同名函數(shù)的
形參列表
(
參數(shù)個(gè)數(shù) 或 類型 或 類型順序
)
不同
,常用來處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型
不同的問題。
1.參數(shù)類型不同
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.參數(shù)個(gè)數(shù)不同
void Func()
{
cout << "void Func()" << endl;
}
void Func(int a)
{
cout << "void Func(int a)" << endl;
}
3.參數(shù)類型順序不同
void F(int a, char b)
{
cout << "void F(int a, char b)" << endl;
}
void F(char b, int a)
{
cout << "void F(char b, int a)" << endl;
}
為什么c語言不支持重載
在
C/C++
中,一個(gè)程序要運(yùn)行起來,需要經(jīng)歷以下幾個(gè)階段:
預(yù)處理、編譯、匯編、鏈接。
1.
實(shí)際項(xiàng)目通常是由多個(gè)頭文件和多個(gè)源文件構(gòu)成,而通過
C
語言階段學(xué)習(xí)的編譯鏈接,我們
可以知道,【當(dāng)前
a.cpp
中調(diào)用了
b.cpp
中定義的
Add
函數(shù)時(shí)】,編譯后鏈接前,
a.o
的目標(biāo)
文件中沒有
Add
的函數(shù)地址,因?yàn)?/p>
Add
是在
b.cpp
中定義的,所以
Add
的地址在
b.o
中。那么
怎么辦呢?
2.
所以鏈接階段就是專門處理這種問題,
鏈接器看到
a.o
調(diào)用
Add
,但是沒有
Add
的地址,就
會(huì)到
b.o
的符號(hào)表中找
Add
的地址,然后鏈接到一起
。
(
老師要帶同學(xué)們回顧一下
)
3.
那么鏈接時(shí),面對(duì)
Add
函數(shù),鏈接接器會(huì)使用哪個(gè)名字去找呢?這里每個(gè)編譯器都有自己的
函數(shù)名修飾規(guī)則。
4.
由于
Windows
下
vs
的修飾規(guī)則過于復(fù)雜,而
Linux
下
g++
的修飾規(guī)則簡(jiǎn)單易懂,下面我們使
用了
g++
演示了這個(gè)修飾后的名字。
5.
通過下面我們可以看出
gcc
的函數(shù)修飾后名字不變。而
g++
的函數(shù)修飾后變成【
_Z+
函數(shù)長(zhǎng)度
+
函數(shù)名
+
類型首字母】。
?結(jié)論:在Linux下,采用g++編譯完成后,函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參數(shù)類型信息添加到修改的名字中。
好啦,這就是今天學(xué)習(xí)的分享啦!看到希望大家的三連呀!
如果有不當(dāng)之處,歡迎大佬指正!
柚子快報(bào)邀請(qǐng)碼778899分享:【C++】入門基礎(chǔ)知識(shí)-1
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。