C++基础入门知识学习(通俗详细讲解)
目錄
- 命名空間
- 標(biāo)注輸入輸出流
- 缺省參數(shù)
- 函數(shù)重載
- 引用
- 內(nèi)聯(lián)函數(shù)
- C++11新特性auto關(guān)鍵字
- C++11新特性基于范圍的for循環(huán)
- 關(guān)鍵字nullptr
命名空間(關(guān)鍵字namespace)
在C++中我們會自己定義很多的變量、函數(shù)和類,這就同時要取各種變量名、函數(shù)名和類名。如果這些變量、函數(shù)和類的名稱都存在與全局作用域中,就要刻意避免重復(fù)命名造成的麻煩,要避免命名沖突或名字污染,就要對這些定義的數(shù)據(jù)類型進(jìn)行嚴(yán)格管理,namespace就是用來對各種標(biāo)識符名稱進(jìn)行本地化管理,避免上述麻煩的關(guān)鍵字。
語法格式是 namespace 命名空間名稱 {} 。大括號里面就是用來定義變量、函數(shù)和類的,這樣的話,即使在其他作用域下有同樣的標(biāo)識符名稱也不會造成沖突,要用到這些名稱時只要注明相應(yīng)的命名空間即可,當(dāng)然是全局作用域下的名稱,就不用注明了,這就把我們要用到的各種標(biāo)識符名稱很好地管理起來了。具體看一下代碼實現(xiàn)。
我們平常學(xué)習(xí)C++時為了方便地使用C++標(biāo)準(zhǔn)庫中的函數(shù)或?qū)ο缶统T诖a前面加上using namespace std;
標(biāo)注輸入輸出流
C++中的標(biāo)準(zhǔn)輸入(鍵盤)和標(biāo)準(zhǔn)輸出(控制臺)所用的關(guān)鍵字分別是cin和cout,需要包含頭文件iostream以及標(biāo)準(zhǔn)命名空間std,與C語言的scanf和printf有很大的不同,使用cout不用增加數(shù)據(jù)格式控制如%d,%f等,它會進(jìn)行自動類型推導(dǎo)并輸出,使用cin時同樣不用加數(shù)據(jù)格式控制符,在鍵盤上輸入當(dāng)類型不同也會發(fā)生隱式類型轉(zhuǎn)換。
int main() {int a;double b;cin >> a>>b;cout << a <<" "<<b << endl;return 0; //cin與>>配合使用 cout與<<配合使用 endl相當(dāng)于換行符\n }缺省參數(shù)
C++函數(shù)的參數(shù)列表中可以有缺省參數(shù),就是默認(rèn)參數(shù)的意思,在調(diào)用函數(shù)傳參時給了具體的值就用具體值,沒有傳實參拷貝值時就用默認(rèn)的值。
//1.全缺省參數(shù) void myprint1(int a = 2, int b = 5, int c = 10) {cout << a + b + c << endl; } //2.半缺省參數(shù) void myprint2(int a, int b = 5, int c = 10) {cout << a + b + c << endl; } int main() {myprint1() ;myprint1(10);myprint2(5);myprint2(3, 4, 5);return 0; }
注意:
- 半缺省參數(shù)必須從右往左依次來給出,不能間隔著給
- 缺省參數(shù)不能在函數(shù)聲明和定義中同時出現(xiàn)
- 缺省值必須是常量或者全局變量
- 4. C語言不支持這樣的語法
函數(shù)重載
C++中有函數(shù)重載的概念,簡單地說就是允許定義函數(shù)名相同的函數(shù),在調(diào)用函數(shù)時,根據(jù)函數(shù)傳入?yún)?shù)類型不同、參數(shù)個數(shù)不同,參數(shù)順序不同來區(qū)分是要調(diào)用同名函數(shù)中的哪一個函數(shù)。所用發(fā)生函數(shù)重載的情形相應(yīng)的就有以下三種。
void func(int a, double b) {cout << "int和double" << endl; } void func(int a) //三個函數(shù)名都為func但兩兩比較有參數(shù)個數(shù)不同、參數(shù)類型不同、順序不同 {cout << "int" << endl; } void func(double a, int b) {cout << "double int" << endl; } int main() {func(1); //因此這里調(diào)用func會按照函數(shù)重載規(guī)則去調(diào)用相應(yīng)的函數(shù)func(1, 1.5);func(2.5, 1);return 0; }函數(shù)重載機(jī)制
程序運(yùn)行要經(jīng)歷預(yù)處理、編譯、匯編和鏈接。當(dāng)我們調(diào)用函數(shù)時在鏈接階段,連接器就要按照函數(shù)名到相應(yīng)的符號表中去找對應(yīng)函數(shù)的入口地址去執(zhí)行哪里的代碼,C語言不支持函數(shù)重載就是因為符號表中的函數(shù)名就為函數(shù)定義時的函數(shù)名,而C++符號表中函數(shù)名有特殊的函數(shù)名修飾規(guī)則,在原函數(shù)名的基礎(chǔ)上,編譯器將函數(shù)參數(shù)類型信息添加到修改后的名字中,最后生成的符號表中的函數(shù)名是唯一對應(yīng)一個函數(shù)入口地址的。這也解釋了函數(shù)返回類型不是產(chǎn)生重載的因素。
引用(關(guān)鍵字&)
引用可以通俗地理解給變量取別名,當(dāng)我們定義一個變量時會在內(nèi)存中相應(yīng)地申請一塊空間,我們?yōu)槭褂眠@塊空間取了個名字,方便我們操縱這塊空間的值,使用引用就為這塊空間取了另外一個名字,使用另外的名字也可以來操縱這塊空間的值。
引用的用法:類型 & 別名=引用實體
要注意引用類型必須和引用實體是同種類型的
常引用
int main() {//int& a = 10; //類型不同 a是變量,10是常量const int& a = 10; const int b = 5;//int& c = b; //類型不同 從b到c權(quán)限放大,不允許這樣,int e = 8;const int& h = e; //從e到h變量到常量是權(quán)限的縮小,循序這樣double d = 3.14;//int& f = d; //類型不匹配const int& f = d; //這里發(fā)生隱式類型轉(zhuǎn)化d是double類型,產(chǎn)生臨時拷貝值是int型具有常屬性,f是臨時拷貝值的引用return 0; }引用的用法
1.作函數(shù)參數(shù)
int add(int& a,int& b) {return a+b; }2.作返回類型
int& add(int a,int b) {static int c=a+b;return c; }注意:如果函數(shù)返回時,出了函數(shù)作用域,如果返回對象還未還給系統(tǒng),則可以使用引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。
引用與指針的區(qū)別
引用傳參和值傳參以及引用返回和值返回效率對比
值傳參和傳值返回都是產(chǎn)生臨時變量返回臨時變量,中間有空間開辟和釋放等操作,相比之下引用傳參和返回就沒有這些過程,所以使用引用可以提高運(yùn)行效率。
內(nèi)聯(lián)函數(shù)(關(guān)鍵字 inline)
用法就是在普通函數(shù)定義的開頭加上修飾字inline,作用是編譯時C++編譯器會在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)壓棧的開銷,達(dá)到提升程序運(yùn)行的效率。
inline int maxnum(int a,int b) {return (a>b)?a:b; }內(nèi)聯(lián)函數(shù)特性
C++11新特性auto關(guān)鍵字
C++11開始auto是自動推導(dǎo)定義數(shù)據(jù)類型,用代碼解釋。
#include<vector> int main() {int a=10;auto b = a; //定義變量b就能推導(dǎo)它是int型,值是10double c=3.14;auto d = c; // 同樣d就是double型,值3.14cout << typeid(b).name() << endl;cout << typeid(d).name() << endl;cout << b << endl;cout << d << endl; vector<int>v1;for (int i = 1; i < 5; i++){v1.push_back(i); //上述用auto來推導(dǎo)int ,double等類型并沒有體現(xiàn)auto帶來的實質(zhì)性好處} //在stl中有很多類型名非常長,就能體現(xiàn)auto帶來的便利了,這里v1.begin()返回的類型即變量for (auto it = v1.begin(); it != v1.end(); it++)//it的類型是vector<int>::iterator。auto it = v1.begin()和vector<int>::iterator it = v1.begin()是等價的{cout << *it << " ";}return 0; }auto使用細(xì)則
1.用auto來聲明指針類型時,auto 和auto * 沒有區(qū)別,但聲明引用類型時一定要用 auto &
2.當(dāng)在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進(jìn)行推導(dǎo),然后用推導(dǎo)出來的類型定義其他變量。
注意auto不能用來作形參推導(dǎo)類型
void func(auto a) //這是不允許的不能用來定義數(shù)組
auto arr[ ] ={3,5,7}; //不能這樣定義數(shù)組C++11新特性基于范圍的for循環(huán)
范圍for循環(huán)的用法
int main() {int arr[] = { 1,2,3,4,5 };for (auto e : arr) //必須傳入數(shù)組名,自動依據(jù)數(shù)組元素個數(shù)推導(dǎo)循壞次數(shù),單趟把數(shù)組的一個元素{ //賦值給e,通過這種形式遍歷數(shù)組。cout << e << " ";}for (auto& e : arr) //加上引用符& 每趟循環(huán)生成不同的e來引用數(shù)組的元素從而操縱數(shù)組內(nèi)容,這里就實現(xiàn)了數(shù)組各個元素+1的操作{e++;}cout << endl;for (auto e : arr) { cout << e << " ";}return 0; }注意
void myprint(int arr[]) { for (auto e : arr) //這里范圍for的效果就會失效,應(yīng)為arr一定要是數(shù)組名,而這里通過傳參的方法時arr已經(jīng)退化為指針了,范圍不能確定了。{ cout << e << " ";} }關(guān)鍵字nullptr
在C++中關(guān)于null定義的代碼如下
#ifndef NULL #ifdef __cplusplus #define NULL 0 //所以null在C++中是等同與整形數(shù)字0 #else #define NULL ((void *)0) #endif #endif void func(int) // {cout << "int" << endl; } void func(int*) {cout << "int*" << endl; } int main() {func(0);func(NULL); // 我們本意是希望參數(shù)是空指針NULL走第二個函數(shù)但實際是走第一個函數(shù)func((int*)NULL); //只用強(qiáng)制轉(zhuǎn)換和參數(shù)是nullptr時才走第二個函數(shù)func(nullptr);return 0; }
引入nullptr就是希望避免NULL是指針還是整形0的混淆引起的特定情形下的錯誤。
注意
總結(jié)
以上是生活随笔為你收集整理的C++基础入门知识学习(通俗详细讲解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工控自动化方案:和利时LE系列PLC数采
- 下一篇: C++学习召集令!