C++——入门知识点汇总(命名空间、缺省、重载、引用等)
文章目錄
- 前言
- 一、什么是C++?
- 二、命名空間
- 2.1 命名空間的定義
- 2.2 命名空間的使用
- 三、輸入&輸出
- 四、缺省參數(shù)
- 4.1 缺省參數(shù)概念
- 4.2 缺省參數(shù)分類
- 注意:
- 五、函數(shù)重載
- 5.1 概念
- 5.2 名字修飾
- 六、引用
- 6.1 概念
- 6.2 引用特性
- 6.3 常引用
- 6.4 使用場(chǎng)景
- 6.4.1 做參數(shù)
- 6.4.2 做返回值
- 6.4.3 變量,指針,數(shù)組的引用
- 6.5 效率比較
- 6.5.1 傳值,傳引用效率比較
- 6.5.2 值和引用的作為返回值類型的性能比較
- 6.6 引用和指針的區(qū)別
- 引用和指針的不同點(diǎn)
- 七、auto關(guān)鍵字
- 7.1 auto簡(jiǎn)介
- 7.2 auto的使用細(xì)則
- 7.2.3 auto與指針和引用結(jié)合起來(lái)使用
- 7.2.4 在同一行定義多個(gè)變量
- 7.3 auto不能推導(dǎo)的場(chǎng)景
前言
本博客意在總結(jié)初學(xué)C++的一些基礎(chǔ)知識(shí),便于回顧與復(fù)習(xí)。
一、什么是C++?
C語(yǔ)言是結(jié)構(gòu)化和模塊化的語(yǔ)言,適合處理較小規(guī)模的程序。對(duì)于復(fù)雜的問(wèn)題,規(guī)模較大的程序,需要高度的抽象和建模時(shí),C語(yǔ)言則不合適。為了解決軟件危機(jī), 20世紀(jì)80年代, 計(jì)算機(jī)界提出了OOP(object oriented programming:面向?qū)ο?思想,支持面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言應(yīng)運(yùn)而生。
1982年,Bjarne Stroustrup博士在C語(yǔ)言的基礎(chǔ)上引入并擴(kuò)充了面向?qū)ο蟮母拍?#xff0c;發(fā)明了一種新的程序語(yǔ)言。為了表達(dá)該語(yǔ)言與C語(yǔ)言的淵源關(guān)系,命名為C++。因此:C++是基于C語(yǔ)言而產(chǎn)生的,它既可以進(jìn)行C語(yǔ)言的過(guò)程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對(duì)象的程序設(shè)計(jì),還可以進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)。
C++發(fā)展至今,已發(fā)布過(guò)許多版本,其中兩個(gè)版本需要特別注意:
1.C++98——C++標(biāo)準(zhǔn)第一個(gè)版本,絕大多數(shù)編譯器都支持,得到了國(guó)際標(biāo)準(zhǔn)化組織(ISO)和美國(guó)標(biāo)準(zhǔn)化。
協(xié)會(huì)認(rèn)可,以模板方式重寫(xiě)C++標(biāo)準(zhǔn)庫(kù),引入了STL(標(biāo)準(zhǔn)模板庫(kù))
2.C++11——增加了許多特性,使得C++更像一種新語(yǔ)言,比如:正則表達(dá)式、基于范圍for循環(huán)、auto關(guān)鍵字、新容器、列表初始化、標(biāo)準(zhǔn)線程庫(kù)等。
二、命名空間
在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用域中,可能會(huì)導(dǎo)致很多沖突。使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對(duì)這種問(wèn)題的。
2.1 命名空間的定義
定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì){}即可, {} 中即為命名空間的成員。如:
namespace S1 //S1為命名空間名稱 {//命名空間中的內(nèi)容,可定義變量,也可定義函數(shù)int a = 10;int Add(int x,int y){return x + y;} }需注意:
- 命名空間可以嵌套——一個(gè)命名空間的{}內(nèi)可以定義別的命名空間;
- 同一工程允許存在多個(gè)名稱想同的命名空間,編譯器最終會(huì)合成同一個(gè)命名空間中。
2.2 命名空間的使用
命名空間的使用方式有三種:
- 加命名空間名稱及作用于限定符::
- 使用using將命名空間中成員引入
- 使用using namespace引入命名空間名稱
三、輸入&輸出
在C語(yǔ)言中,我們通常使用scanf & printf進(jìn)行輸入與輸出,在C++中,我們當(dāng)然也可以這么做,不過(guò)C++提出一種新的方式——cin & cout使我們的輸入輸出更加方便。
首先看一下C++的hello,world如何輸出:
#include<iostream> using namespace std;int main() {cout<<"Hello world!!!"<<endl;//<<后為需要輸出的內(nèi)容,endl為換行符return 0; }注意:
觀察如上代碼,可以發(fā)現(xiàn)任何類型的變量,直接輸入/輸出即可,不必關(guān)注變量類型。
四、缺省參數(shù)
在C++中提出了缺省參數(shù),思想類似于備胎…
4.1 缺省參數(shù)概念
缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。在調(diào)用該函數(shù)時(shí),如果沒(méi)有指定實(shí)參則采用該默認(rèn)值,否則使用指定的實(shí)參,例:
void TestFunc(int a = 0) {cout<<a<<endl; } int main() {TestFunc(); // 沒(méi)有傳參時(shí),使用參數(shù)的默認(rèn)值TestFunc(10); // 傳參時(shí),使用指定的實(shí)參 }4.2 缺省參數(shù)分類
1. 全缺省參數(shù)
顧名思義就是全部參數(shù)都有默認(rèn)值啦(都是備胎)。如:
void TestFunc(int a = 10, int b = 20, int c = 30) {cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl; }2. 半缺省參數(shù)
void TestFunc(int a, int b = 10, int c = 20) {cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl; }注意:
- 半缺省參數(shù)必須從右往左依次來(lái)給出,不能間隔著給;
- 缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn)(防止誤導(dǎo)編譯器);
- 缺省值必須是常量或者全局變量;
- C語(yǔ)言不支持(編譯器不支持)。
五、函數(shù)重載
5.1 概念
函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù) 或 類型 或 順序)必須不同,常用來(lái)處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問(wèn)題
int Add(int left, int right) {return left+right; } double Add(double left, double right) {return left+right; }int main() {Add(10, 20);Add(10.0, 20.0);return 0; }5.2 名字修飾
為什么C++支持重載而C語(yǔ)言不支持呢,原因在編譯器函數(shù)名修飾規(guī)則不同。
在C/C++中,一個(gè)程序要運(yùn)行起來(lái),需要經(jīng)歷以下幾個(gè)階段:預(yù)處理、編譯、匯編、鏈接。而在鏈接階段,面對(duì)一個(gè)函數(shù),連接器會(huì)根據(jù)函數(shù)名去尋找相應(yīng)的地址,然后鏈接到一起。對(duì)于C語(yǔ)言,函數(shù)修飾后名字是不變的,然而連接器對(duì)于相同名字的函數(shù)該去鏈接哪個(gè)是沒(méi)有辦法判斷的(同名函數(shù)無(wú)法區(qū)分),而對(duì)于C++來(lái)說(shuō),編譯完成后函數(shù)名字的修飾會(huì)根據(jù)它的參數(shù)列表發(fā)生改變,不同的參數(shù)會(huì)被修飾為不同的名稱,這樣,鏈接時(shí)連接器就會(huì)根據(jù)不同的名稱尋找相應(yīng)的地址完成鏈接啦。
注意:
- 不同的系統(tǒng)下,名字修飾規(guī)則是不同的(如linux與windows)
- C++中函數(shù)重載底層的處理方法:C++利用命名傾軋技術(shù)改變函數(shù)名,區(qū)分參數(shù)不同的同名函數(shù)(編譯階段)。
六、引用
6.1 概念
引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開(kāi)辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。
類型& 引用變量名(對(duì)象名) = 引用實(shí)體; void TestRef() {int a = 10;int& ra = a;//<====定義引用類型printf("%p\n", &a);printf("%p\n", &ra); }注意:引用類型必須和引用實(shí)體是同種類型的。
6.2 引用特性
6.3 常引用
觀察如下代碼:,可以發(fā)現(xiàn),引用的類型必須和被引用類型一樣。
void TestConstRef() {const int a = 10;//int& ra = a; // 該語(yǔ)句編譯時(shí)會(huì)出錯(cuò),a為常量const int& ra = a;// int& b = 10; // 該語(yǔ)句編譯時(shí)會(huì)出錯(cuò),b為常量const int& b = 10;double d = 12.34;//int& rd = d; // 該語(yǔ)句編譯時(shí)會(huì)出錯(cuò),類型不同const int& rd = d;}6.4 使用場(chǎng)景
6.4.1 做參數(shù)
void Swap(int& left, int& right) {int temp = left;left = right;right = temp; }6.4.2 做返回值
int& Count() {static int n = 0;n++;// ...return n; }注意::如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對(duì)象還未還給系統(tǒng),則可以使用引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。(傳值時(shí),創(chuàng)建無(wú)名臨時(shí)空間來(lái)接受返回值)
6.4.3 變量,指針,數(shù)組的引用
//變量的引用int a = 1;int &b = a; //指針的引用int *ptr = &a;int *&q = ptr; //數(shù)組的引用int arr[n] = {1,2,3,4,5};int(&pa)[5] = arr;6.5 效率比較
6.5.1 傳值,傳引用效率比較
以值作為參數(shù)或者返回值類型,在傳參和返回期間,函數(shù)不會(huì)直接傳遞實(shí)參或者將變量本身直接返回,而是傳遞實(shí)參或者返回變量的一份臨時(shí)的拷貝,因此用值作為參數(shù)或者返回值類型,效率是非常低下的,尤其是
當(dāng)參數(shù)或者返回值類型非常大時(shí),效率就更低。
6.5.2 值和引用的作為返回值類型的性能比較
引用作為返回值比值作為返回值的效率好很多,但是如果返回值的生命周期受限則不能使用引用返回。
6.6 引用和指針的區(qū)別
在語(yǔ)法概念上引用就是一個(gè)別名,沒(méi)有獨(dú)立空間,和其引用實(shí)體共用同一塊空間。但底層實(shí)現(xiàn)上實(shí)際是有空間的,因?yàn)?strong>引用是按照指針?lè)绞絹?lái)實(shí)現(xiàn)的。
引用和指針的不同點(diǎn)
七、auto關(guān)鍵字
7.1 auto簡(jiǎn)介
在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動(dòng)存儲(chǔ)器的局部變量,但遺憾的是一直沒(méi)有人去使用它。
C++11中,標(biāo)準(zhǔn)委員會(huì)賦予了auto全新的含義即:auto不再是一個(gè)存儲(chǔ)類型指示符,而是作為一個(gè)新的類型指示符來(lái)指示編譯器,auto聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得。
觀察一段代碼讓我們更好的了解auto:
int TestAuto() {return 10; } int main() {int a = 10;auto b = a;auto c = 'a';auto d = TestAuto();cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;//auto e; 無(wú)法通過(guò)編譯,使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化return 0; }上面的代碼部分,可以看到b,c,d的類型分別是int型,char型和 int型,在C語(yǔ)言中,初始化變量時(shí)我們必須得指明定義的變量的類型,但有了auto我們便可不再那樣麻煩,它會(huì)自動(dòng)推導(dǎo)auto表達(dá)式的實(shí)際類型并變換為實(shí)際類型,這就是auto的作用!
注意:使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化,在編譯階段編譯器需要根據(jù)初始化表達(dá)式來(lái)推導(dǎo)auto的實(shí)際類型。因此auto并非是一種“類型”的聲明,而是一個(gè)類型聲明時(shí)的“占位符”,編譯器在編譯期會(huì)將auto替換為變量實(shí)際的類型。
7.2 auto的使用細(xì)則
7.2.3 auto與指針和引用結(jié)合起來(lái)使用
用auto聲明指針類型時(shí),用auto和auto*沒(méi)有任何區(qū)別,但用auto聲明引用類型時(shí)則必須加&。
int main() {int x = 10;auto a = &x;auto* b = &x;auto& c = x;cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;}7.2.4 在同一行定義多個(gè)變量
當(dāng)在同一行聲明多個(gè)變量時(shí),這些變量必須是相同的類型,否則編譯器將會(huì)報(bào)錯(cuò),因?yàn)榫幾g器實(shí)際只對(duì)
第一個(gè)類型進(jìn)行推導(dǎo),然后用推導(dǎo)出來(lái)的類型定義其他變量.
7.3 auto不能推導(dǎo)的場(chǎng)景
1.auto不能作為函數(shù)的參數(shù)
2. auto不能直接用來(lái)聲明數(shù)組
3. 為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法
4. auto在實(shí)際中最常見(jiàn)的優(yōu)勢(shì)用法就是跟C++11提供的新式for循環(huán),還有l(wèi)ambda表達(dá)式等
進(jìn)行配合使用
總結(jié)
以上是生活随笔為你收集整理的C++——入门知识点汇总(命名空间、缺省、重载、引用等)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言——常见的字符串函数+内存操作函数
- 下一篇: Linux——进程系列知识详述(操作系统