中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

騰訊郵箱網(wǎng)頁(yè)版湖南seo網(wǎng)站多少錢(qián)

騰訊郵箱網(wǎng)頁(yè)版,湖南seo網(wǎng)站多少錢(qián),用html5設(shè)計(jì)個(gè)人網(wǎng)站,wordpress qq空間主題文章目錄 前言一、C歷史及發(fā)展1.C是什么2.C歷史 二、開(kāi)始C1.基礎(chǔ)類(lèi)型1.第一個(gè)簡(jiǎn)單的C程序2.命名空間1.命名空間的介紹2.命名空間的使用3.命名空間的using聲明與using指示 3.初識(shí)輸入輸出操作4.引用1.引用概念2.引用的使用1.引用做參數(shù)2.引用做返回值 3.引用和指針的區(qū)別4.const…

文章目錄

  • 前言
  • 一、C++歷史及發(fā)展
    • 1.C++是什么
    • 2.C++歷史
  • 二、開(kāi)始C++
    • 1.基礎(chǔ)類(lèi)型
      • 1.第一個(gè)簡(jiǎn)單的C++程序
      • 2.命名空間
        • 1.命名空間的介紹
        • 2.命名空間的使用
        • 3.命名空間的using聲明與using指示
      • 3.初識(shí)輸入輸出操作
      • 4.引用
        • 1.引用概念
        • 2.引用的使用
          • 1.引用做參數(shù)
          • 2.引用做返回值
        • 3.引用和指針的區(qū)別
        • 4.const的引用
      • 5.auto關(guān)鍵字
        • 1.auto簡(jiǎn)介
        • 2.復(fù)合類(lèi)型,常量和auto
          • 1.auto與指針和引用結(jié)合使用
    • 2.語(yǔ)句
      • 1.范圍for
    • 3.函數(shù)
      • 1.缺省參數(shù)的函數(shù)
        • 1.缺省參數(shù)的概念
        • 2.缺省參數(shù)的分類(lèi)
          • 1.全缺省參數(shù)
          • 2.半缺省參數(shù)
      • 2.函數(shù)的重載
        • 1.函數(shù)重載的概念
        • 2.調(diào)用重載的函數(shù)
      • 3.內(nèi)斂函數(shù)
    • 4.其他
      • 1.nullptr

前言

C++是在C的基礎(chǔ)之上,容納進(jìn)去了面向?qū)ο缶幊趟枷?#xff0c;并且增加了許多有用的庫(kù)。熟悉C語(yǔ)言對(duì)C++學(xué)習(xí)有很大的幫助,C++是對(duì)C語(yǔ)言的補(bǔ)充和對(duì)C語(yǔ)言進(jìn)行優(yōu)化。本章我們學(xué)習(xí)一點(diǎn)C++的基礎(chǔ)內(nèi)容,先淺淺的了解一下C++。

一、C++歷史及發(fā)展

了解一門(mén)語(yǔ)言,我們要先看一下它的發(fā)展歷史和出現(xiàn)的原因,方便我們更好的了解語(yǔ)言適合解決什么樣的問(wèn)題。

1.C++是什么

在20世紀(jì)80年代, 計(jì)算機(jī)界提出了OOP(object oriented programming:面向?qū)ο?思想,為了解決C語(yǔ)言對(duì)于復(fù)雜的問(wèn)題,規(guī)模較大的程序,需要高度的抽象和建模時(shí)的困境。
在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ù)類(lèi)型為特點(diǎn)的基于對(duì)象的程序設(shè)計(jì),還可以進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)。

2.C++歷史

1979年,貝爾實(shí)驗(yàn)室的Bjarne Stroustrup(本賈尼)等人試圖分析unix內(nèi)核的時(shí)候,試圖將內(nèi)核模塊化,于是在C語(yǔ)言的基礎(chǔ)上進(jìn)行擴(kuò)展,增加了類(lèi)的機(jī)制,完成了一個(gè)可以運(yùn)行的預(yù)處理程序,稱(chēng)之為C with classes。現(xiàn)在公司主流使用還是C++98和C++11。

二、開(kāi)始C++

1.基礎(chǔ)類(lèi)型

1.第一個(gè)簡(jiǎn)單的C++程序

#include<iostream>
using namespace std;
int main()
{int a = 0;int b = 0;//從鍵盤(pán)上獲得值,相當(dāng)于C語(yǔ)言的scanf函數(shù)cin >> a >> b;//把結(jié)果輸出到屏幕,相當(dāng)于C語(yǔ)言的printf函數(shù)cout << a + b << endl;return 0; 
}

相信大部分課本的代碼案例都是如此。讓我們看一下運(yùn)行的結(jié)果吧.
在這里插入圖片描述
這個(gè)簡(jiǎn)單的小程序就實(shí)現(xiàn)了,但是在C++Primer中是下面的寫(xiě)法:

#include<iostream>
int main()
{int a = 0;int b = 0;std::cin >> a >> b;std::cout << a + b << std::endl;return 0;
}

在這里插入圖片描述
結(jié)果和上面一模一樣,那么上面的using namespace std和std::分別是什么呢?為什么可以有兩種寫(xiě)法呢?

2.命名空間

針對(duì)上面的問(wèn)題,我們來(lái)介紹一下C++中的命名空間。

1.命名空間的介紹

因?yàn)樽兞?、函?shù)和類(lèi)的名稱(chēng)將都存在于全局作用域中,可能會(huì)導(dǎo)致很多沖突。使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱(chēng)進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對(duì)這種問(wèn)題的。
在這里插入圖片描述
對(duì)比上面的代碼我們可以看出使用了未加using namespace std在實(shí)現(xiàn)代碼中多了一些東西,這是因?yàn)槲覀冇玫降膸?kù)函數(shù)基本都屬于命名空間std,例如std::cin表示標(biāo)準(zhǔn)輸入中獲取內(nèi)容。此處使用的是作用域操作符(::),意思是編譯器應(yīng)該從操作符左側(cè)的作用域來(lái)尋找右側(cè)的名字。因此std::cin的意思是使用命名空間std的名字cin

2.命名空間的使用

當(dāng)我們多個(gè)文件使用的全局變量,函數(shù)或者結(jié)構(gòu)體使用的名字相同時(shí),這時(shí)間就會(huì)產(chǎn)生命名沖突,在C語(yǔ)言中是沒(méi)半法很好的解決這些問(wèn)題的。如:
在這里插入圖片描述
那么在C++中如何解決這些問(wèn)題的呢,我們引入了命名空間這個(gè)概念。
namespace關(guān)鍵字,后面跟命名空間的名字,然后加一對(duì){},{}中即為命名空間的成員
在這里插入圖片描述
加入我們的命名空間就可以解決這樣的問(wèn)題了命名空間也是可以嵌套的。

3.命名空間的using聲明與using指示

我們先看什么是using聲明與using指示
在這里插入圖片描述
區(qū)別:
一條using聲明語(yǔ)句一次只引入命名空間的一個(gè)成員,它使得我們很清楚地知道程序中所用的到底是哪個(gè)名字。一條using聲明語(yǔ)句可以出現(xiàn)在全局作用域,局部作用域,命名空間作用域以及類(lèi)的作用域,在類(lèi)的作用域中,這樣的聲明語(yǔ)句只能指向基類(lèi)成員。
using指示中,我們無(wú)法控制哪些名字是可見(jiàn)的,因?yàn)樗忻侄际强梢?jiàn)的。且using指示不可以出現(xiàn)在類(lèi)中。
在using指示中,以關(guān)鍵字using開(kāi)始,后面跟namespace關(guān)鍵字以及命名空間的名字,如果這里的名字不是已經(jīng)定義好的命名空間名字,程序?qū)?huì)發(fā)生錯(cuò)誤。
命名空間只會(huì)影響使用,不會(huì)影響生命周期。
更加詳細(xì)的可以看C++Primer。

3.初識(shí)輸入輸出操作

C++并未定義任何輸入輸出(IO)語(yǔ)句,而是包含了一個(gè)全面的標(biāo)準(zhǔn)庫(kù)來(lái)提供IO機(jī)制。我們輸入輸出使用了iostream庫(kù),iostream庫(kù)包含兩個(gè)基礎(chǔ)類(lèi)型istream和ostream,分別表示輸入流和輸出流
標(biāo)準(zhǔn)庫(kù)定義了4個(gè)IO對(duì)象,為了處理輸入,我們使用了一個(gè)cin的istream類(lèi)型的對(duì)象,這個(gè)對(duì)象也被稱(chēng)為標(biāo)準(zhǔn)輸入。對(duì)于輸出,我們使用了一個(gè)cou的ostream類(lèi)型的對(duì)象,此對(duì)象也被稱(chēng)為標(biāo)準(zhǔn)輸出。標(biāo)準(zhǔn)庫(kù)還定義了其他兩個(gè)ostream對(duì)象,分別為cerr和clog,我們一般用cerr來(lái)輸出警告和錯(cuò)誤信息,因此cerr也叫標(biāo)準(zhǔn)錯(cuò)誤。而clog用來(lái)輸出程序運(yùn)行時(shí)的一般性信息。

#include<iostream>
using namespace std;
int main()
{int a = 0;int b = 0;cin >> a >> b;//標(biāo)準(zhǔn)輸入cout << a + b <<endl;//標(biāo)準(zhǔn)輸出return 0;
}

上面一個(gè)簡(jiǎn)單的相加程序就用到了們標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出。
<<(輸出運(yùn)算符):<<運(yùn)算符接受兩個(gè)運(yùn)算對(duì)象:左側(cè)的運(yùn)算對(duì)象必須是一個(gè)ostream對(duì)象,右側(cè)的對(duì)象是要打印的值。此運(yùn)算符將給定的值寫(xiě)入到給定的ostream對(duì)象中。
>>(輸入運(yùn)算符):>>與輸出運(yùn)算符相似,它接受一個(gè)istream作為其左側(cè)運(yùn)算對(duì)象,接收一個(gè)對(duì)象作為右側(cè)運(yùn)算對(duì)象。此運(yùn)算符將給定的值寫(xiě)入到給定的ostream對(duì)象中。

	cin >> a;cin >> b;cin >> a >> b;//效果和上面等價(jià)cout << a ;cout << b ;cout << a << b;//效果和上面等價(jià)

4.引用

1.引用概念

引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開(kāi)辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。

int main()
{//類(lèi)型& 引用變量名(對(duì)象名) = 引用實(shí)體int a = 10;int& sa = a;//sa指向a(是a的另一個(gè)名字)int& saa;//報(bào)錯(cuò):引用必須被初始話return 0;
}

定義引用時(shí),程序把引用和它的初始值綁定在一起,而不是將初始值拷貝給引用,一旦初始話完成,引用將和它的初始值對(duì)象一直綁定在一起。因?yàn)闊o(wú)法更改綁定對(duì)象,所以引用必須初始化!!!

int main()
{int a = 10;int& sa = a;a++;//對(duì)a進(jìn)行++cout <<"sa = " << sa << endl;//sa的值也會(huì)隨著發(fā)生改變sa++;//對(duì)sa進(jìn)行++cout <<" a = " << a << endl;//a的值也會(huì)隨著發(fā)生改變return 0;
}

在這里插入圖片描述
下面我們看一些引用的例子:

int main()
{int val = 10;int rval1 = val;//把val的值賦給rval1int &rval2 = val;//rval2是val的引用int& rval3 = rval2;//rval3是rval2的引用,此時(shí)也是val的引用int& rval4 = 10;//錯(cuò)誤:引用類(lèi)型的初始值必須是一個(gè)對(duì)象double& rval5 = val;//錯(cuò)誤:此處引用的初始值類(lèi)型必須為double類(lèi)型return 0;
}

在引用中,引用只能綁定在對(duì)象中,而不能與字面值或某個(gè)表達(dá)式的計(jì)算結(jié)果綁定到一起。但也有例外情況。原因也會(huì)在下面演示。

2.引用的使用

1.引用做參數(shù)
void Swap(int* a, int* b)//指針類(lèi)型接收參數(shù)
{int tmp = *a;*a = *b;*b = tmp;
}
void SWAP(int &sa, int &sb)//引用類(lèi)型接收參數(shù),此時(shí)的sa就是main函數(shù)中的a,sb是main函數(shù)中的b
{int tmp = sa;sa = sb;sb = tmp;
}
int main()
{int a = 10;int b = 20;Swap(&a, &b);//指針類(lèi)型的傳參printf("a = %d  b = %d\n", a, b);SWAP(a, b);//引用類(lèi)型傳參printf("a = %d  b = %d\n", a, b);return 0;
}

在這里插入圖片描述

2.引用做返回值
int& ADD(int a, int b)
{static int c = 0;c = a + b;return c;
}
int& add(int a, int b)
{int c = 0;c = a + b;return c;
}
int main()
{int a = 10;int b = 20;int& c1 = ADD(a, b);cout << c1 << endl;cout << "ADD(a, b) val is:" << c1 << endl;int& c2 = add(a, b);cout << c2 << endl;cout <<"add(a, b) val is:" << c2 << endl;return 0;
}

上面的代碼有什么結(jié)果呢?
在這里插入圖片描述
對(duì)比可以發(fā)現(xiàn),當(dāng)引用做返回值時(shí)如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對(duì)象還在(還沒(méi)還給系統(tǒng)),則可以使用引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。因?yàn)楹瘮?shù)調(diào)用創(chuàng)建棧幀會(huì)使用該片空間。

3.引用和指針的區(qū)別

int main()
{int val = 10;int vbl = 20;int &rval = val;//rval是val的引用int* pa = &val;//pa是指向val的指針(*pa)++;cout << val << endl;rval++;cout << val << endl;pa = &vbl;//pa現(xiàn)在指向vblreturn 0;
}

運(yùn)行結(jié)果:
在這里插入圖片描述
觀察匯編代碼:
在這里插入圖片描述
我們發(fā)現(xiàn)引用的匯編指令和指針的匯編指令相同,引用的底層邏輯就是指針。
引用和指針的區(qū)別:

  1. 引用概念上定義一個(gè)變量的別名,指針存儲(chǔ)一個(gè)變量地址
  2. 引用在定義時(shí)必須初始化,引用不可以為NULL指針可以為NULL
  3. 引用初始化后就不可以更改,而指針隨時(shí)更改指向?qū)ο蟆?/li>
  4. 在sizeof中引用結(jié)果為引用類(lèi)型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)。
  5. 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類(lèi)型的大小。
  6. 有多級(jí)指針,但是沒(méi)有多級(jí)引用。
  7. 訪問(wèn)實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理
  8. 引用比指針使用起來(lái)相對(duì)更安全。

4.const的引用

我們可以把引用綁定到const對(duì)象上,就像綁定到其他的對(duì)象上一樣,我們稱(chēng)之為對(duì)常量的引用,與普通引用不同的是,對(duì)常量的的引用不能被作用修改它所綁定的對(duì)象。

int main()
{const int a = 10;const int& ra1 = a;//引用及其對(duì)象都是常量int& ra1 = a;//錯(cuò)誤,試圖讓一個(gè)非常量引用指向一個(gè)常量對(duì)象
}

在我們上面看到的引用類(lèi)型必須與其所引用的對(duì)象類(lèi)型一致,但有兩個(gè)例外:
一是在初始化常量引用時(shí)允許任意表達(dá)式作為初始值,只要該表達(dá)式的結(jié)果可以轉(zhuǎn)化為引用類(lèi)型即可,尤其允許為一個(gè)常量引用綁定非常量的對(duì)象,字面值,甚至是一個(gè)表達(dá)式。

int main()
{int a = 10;const int& sa1 = a;//允許將const int& 綁定到一個(gè)普通int對(duì)象上const int& sa2 = 10;//sa2是常量引用,因?yàn)閟a2不可以改變,所以可以綁定到常量上const int& sa3 = sa1 * 2;//sa3是常量引用int &sa4 = sa1 * 2;//sa4是一個(gè)普通引用,不可以綁定到常量上return 0;
}

我們下面來(lái)看由duoble綁定int類(lèi)型為什么不可以

int main()
{double val = 3.14;const int& sval1 = val;//正確int& sval2 = val;//錯(cuò)誤return 0;
}

在這里插入圖片描述
我們來(lái)分析一下原因:
在這里插入圖片描述
類(lèi)型轉(zhuǎn)化都會(huì)產(chǎn)生臨時(shí)變量,臨時(shí)變量具有常屬性,所以這也是為什么上面的綁定不成功的原因,我們需要用常引用來(lái)進(jìn)行綁定。

5.auto關(guān)鍵字

1.auto簡(jiǎn)介

在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動(dòng)存儲(chǔ)器的局部變量,但遺憾的是一直沒(méi)有人去使用它,于是C++11中,標(biāo)準(zhǔn)委員會(huì)賦予了auto全新的含義即:auto不再是一個(gè)存儲(chǔ)類(lèi)型指示符,而是作為一個(gè)新的類(lèi)型指示符來(lái)指示編譯器,auto聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得。顯然,auto定義的變量必須有初始值。

int Testauto()
{return 0;
}
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;return 0;
}

在這里插入圖片描述

2.復(fù)合類(lèi)型,常量和auto

編譯器推斷出來(lái)的auto類(lèi)型有時(shí)間和初始值的類(lèi)型并不完全一樣,編譯器會(huì)適當(dāng)?shù)母淖兘Y(jié)果類(lèi)型使其更符合初始化規(guī)則

1.auto與指針和引用結(jié)合使用

使用引用其實(shí)就是使用引用的對(duì)象,特別是當(dāng)引用被用作初始值時(shí),真正參與初始化的其實(shí)是引用對(duì)象的值

int main()
{int a = 10;int& b = a;auto c = b;cout << typeid(c).name() << endl;return 0;
}

在這里插入圖片描述

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;return 0;
}

在這里插入圖片描述
從上面我們可以看出用auto聲明指針類(lèi)型時(shí),用auto和auto*沒(méi)有任何區(qū)別,但用auto聲明引用類(lèi)型時(shí)則必須加&
要在一條語(yǔ)句中定義多個(gè)變量(*和&只從屬于某個(gè)聲明符,而非基本數(shù)據(jù)類(lèi)型的一部分),初始值必須是同一類(lèi)型。

int main()
{auto a = 1, b = 2;auto c = 1, d = 2.0;// 該行代碼會(huì)編譯失敗,因?yàn)閏和d的初始化表達(dá)式類(lèi)型不同return 0;
}

注意:auto不能作為函數(shù)的參數(shù), auto也不可直接聲明數(shù)組。

2.語(yǔ)句

1.范圍for

對(duì)于一個(gè)有范圍的集合而言,由程序員來(lái)說(shuō)明循環(huán)的范圍是多余的,有時(shí)候還會(huì)容易犯錯(cuò)誤。因
此C++11中引入了基于范圍的for循環(huán)。for循環(huán)后的括號(hào)由冒號(hào)“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍。

//語(yǔ)法形式
for (declaration : expression)
{statement;
}

expression:表示的必須是一個(gè)序列,如數(shù)組,vector或者string類(lèi)型等類(lèi)型的對(duì)象,這些類(lèi)型的共同特點(diǎn)就是擁有能返回迭代器的begin和end成員(后面會(huì)提迭代器)
declaration:定義一個(gè)變量,序列中的每個(gè)元素都可以轉(zhuǎn)換為該變量的類(lèi)型。確保這些類(lèi)型的最簡(jiǎn)單辦法就是使用auto。
statement:循環(huán)語(yǔ)句。

int main()
{int tmp[] = { 1,2,3,4,5,6,7,8,9 };for (auto i : tmp){cout << i << " ";}return 0;
}

在這里插入圖片描述
這就是一個(gè)簡(jiǎn)單范圍for
思考一下下面的代碼中數(shù)組的內(nèi)容會(huì)不會(huì)改變呢?

int main()
{int tmp[] = { 1,2,3,4,5,6,7,8,9 };for (auto i : tmp){i *= 2;cout << i << " ";}cout << endl;for (auto i : tmp){cout << i << " ";}return 0;
}

在這里插入圖片描述
對(duì)比發(fā)現(xiàn),我們對(duì)定義變量的改變并不會(huì)影響我們數(shù)組的內(nèi)容。因?yàn)槲覀儗?duì)定義的變量是對(duì)序列中元素的拷貝。對(duì)變量的改動(dòng)并不會(huì)影響我們序列中的元素。
我們?cè)賮?lái)看下面的代碼:

int main()
{int tmp[] = { 1,2,3,4,5,6,7,8,9 };for (auto i : tmp){i *= 2;cout << i << " ";}cout << endl;for (auto i : tmp){cout << i << " ";}return 0;
}

在這里插入圖片描述
此時(shí)我們對(duì)變量的更改影響了我們數(shù)組中的元素,因?yàn)槲覀兊谝淮畏秶鷉or中的定義的變量為引用,它是序列元素的別名,對(duì)這個(gè)變量的改變就相當(dāng)于對(duì)數(shù)組內(nèi)容的改變。
判斷下面的代碼是否是正確的呢?

void Testfor(int tmp[])
{for (auto& i : tmp){cout << i << " ";}
}
int main()
{int tmp[] = { 1,2,3,4,5,6,7,8,9 };return 0;
}

答案是不正確的,范圍for循環(huán)迭代的范圍必須是確定的,對(duì)于數(shù)組而言,就是數(shù)組中第一個(gè)元素和最后一個(gè)元素的范圍;對(duì)于類(lèi)而言,應(yīng)該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍。
在這里插入圖片描述
我們看到編譯器也允許這樣使用,在上面代碼中數(shù)組傳參,退化為了指針,此時(shí)用范圍for找不begin和end的位置。

3.函數(shù)

1.缺省參數(shù)的函數(shù)

1.缺省參數(shù)的概念

缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒(méi)有指定實(shí)參則采用該形參的缺省值,否則使用指定的實(shí)參。
如:

void Cout(int a = 0)
{cout << a << endl;
}
int main()
{int a = 10;Cout();Cout(a);return 0;
}

在這里插入圖片描述
當(dāng)我們沒(méi)有像這個(gè)函數(shù)傳入?yún)?shù)時(shí),函數(shù)使用的默認(rèn)值0,當(dāng)我們傳入?yún)?shù)時(shí),函數(shù)使用我們所傳遞的參數(shù)。

2.缺省參數(shù)的分類(lèi)

1.全缺省參數(shù)
void Cout(int a = 1, int b = 2, int c = 3)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;cout << endl;
}

上面這個(gè)就是全缺省參數(shù)的函數(shù),所有的形參都有默認(rèn)值。
下面我們來(lái)測(cè)試一下函數(shù):

int main()
{int a = 10;int b = 20;int c = 30;Cout();Cout(a);Cout(a,b);Cout(a,b,c);Cout(c);return 0;
}

在這里插入圖片描述
我們可以發(fā)現(xiàn)當(dāng)我們傳入的參數(shù)小于所需的個(gè)數(shù)時(shí),形參會(huì)從左向右依次接收。

2.半缺省參數(shù)
void Cout(int a, int b = 2, int c = 3)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;cout << endl;
}

此時(shí)這個(gè)函數(shù)就是半缺省參數(shù)。
注意:半缺省參數(shù)必須從右往左依次來(lái)給出,不能間隔著給,且缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn)。一旦某個(gè)形參被賦予了默認(rèn)值,那么他后面的所有形參都必須有默認(rèn)值。

2.函數(shù)的重載

C++允許在同一作用域中聲明幾個(gè)功能類(lèi)似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù) 或 類(lèi)型 或 類(lèi)順序)不同。常用來(lái)處理實(shí)現(xiàn)功能類(lèi)似數(shù)據(jù)類(lèi)型不同的問(wèn)題。

1.函數(shù)重載的概念

在同一作用域內(nèi)的幾個(gè)函數(shù)名字完全相同但形參列表不同,我們稱(chēng)之為重載函數(shù)

int Add(int a, int b)
{return a + b;
}
double Add(double a, double b)
{return a + b;
}
int Add(int a, double b)
{return a + b;
}
int main()
{int a = 10, b = 20;double c = 10.125, d = 20.25;cout << Add(a, b) << endl;cout << Add(c, d) << endl;return 0;
}

如上述代碼中的Add就構(gòu)成了重載
在這里插入圖片描述
構(gòu)成函數(shù)的重載必須是函數(shù)參數(shù)不相同(如個(gè)數(shù),類(lèi)型等)

2.調(diào)用重載的函數(shù)

當(dāng)我們定義了一組重載函數(shù)后,我們需要合理的實(shí)參來(lái)調(diào)用他們,函數(shù)匹配是一個(gè)過(guò)程,函數(shù)匹配也叫重載確定,用編譯器決定調(diào)用哪一個(gè)函數(shù)。
此時(shí)有三種情況:
1.編譯器找到一個(gè)與實(shí)參最佳辟匹配的函數(shù),并生成調(diào)用該函數(shù)。
2.找不到任何一個(gè)函數(shù)與調(diào)用的實(shí)參相匹配,此時(shí)編譯器發(fā)出無(wú)匹配的錯(cuò)誤信息。
3.有多于一個(gè)函數(shù)可以進(jìn)行匹配,但每個(gè)都不是最佳選擇,此時(shí)也發(fā)生錯(cuò)誤,稱(chēng)為二義性調(diào)用。

如上圖(出自《程序員的自我修養(yǎng)》p89),是vs對(duì)函數(shù)重載在編譯器的名稱(chēng)。

3.內(nèi)斂函數(shù)

我們可以將函數(shù)指定為內(nèi)斂函數(shù)(inline),編譯時(shí)C++編譯器會(huì)在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開(kāi),沒(méi)有函數(shù)調(diào)用建立棧幀的開(kāi)銷(xiāo),內(nèi)聯(lián)函數(shù)提升程序運(yùn)行的效率。

inline int Add(int a, int b)
{return a + b;
}
int main()
{int a = 10, b = 20;int c = Add(a, b);return 0;
}

上面在編譯過(guò)程展開(kāi)類(lèi)似下面的形式:

int c = a + b;//直接對(duì)函數(shù)進(jìn)行展開(kāi)

內(nèi)斂說(shuō)明只是向編譯器發(fā)送一個(gè)請(qǐng)求,編譯器可以忽略這個(gè)請(qǐng)求。
一般來(lái)說(shuō),內(nèi)斂機(jī)制用于優(yōu)化規(guī)模小,流程直接,調(diào)用頻繁的函數(shù),很多編譯器都不支持內(nèi)斂遞歸函數(shù)。
nline是一種以空間換時(shí)間的做法,如果編譯器將函數(shù)當(dāng)成內(nèi)聯(lián)函數(shù)處理,在編譯階段,會(huì)用函數(shù)體替換函數(shù)調(diào)用,缺陷:可能會(huì)使目標(biāo)文件變大,優(yōu)勢(shì):少了調(diào)用開(kāi)銷(xiāo),提高程序運(yùn)行效率。

4.其他

1.nullptr

nullptr是一種特殊類(lèi)型的字面值。
在過(guò)去的程序中用的名為NULL的預(yù)處理變量來(lái)給指針賦值,這個(gè)變量在頭文件cstdilb中定義,它的值為0,因此使用NULL初始化指針和用0初始化指針是一樣的。在C++中最好使用nullptr,同時(shí)盡量避免使用NULL。

void f(int)
{cout << "f(int)" << endl;
}
void f(int*)
{cout << "f(int*)" << endl;
}
int main()
{f(0);f(NULL);return 0;
}

在這里插入圖片描述
我們可以發(fā)現(xiàn)當(dāng)我們傳NULL時(shí)并沒(méi)有走指針的函數(shù),所以當(dāng)我們傳指針類(lèi)型時(shí),避免使用NULL

http://www.risenshineclean.com/news/55007.html

相關(guān)文章:

  • 免費(fèi) 建網(wǎng)站seo英文怎么讀
  • 寶安中心醫(yī)院是什么級(jí)別對(duì)seo的理解
  • 校園無(wú)線網(wǎng)絡(luò)設(shè)計(jì)方案seo小白入門(mén)教學(xué)
  • 網(wǎng)站開(kāi)發(fā)人員的水平滕州今日頭條新聞
  • wordpress 插件 文本合肥seo網(wǎng)站排名
  • 陽(yáng)谷網(wǎng)站建設(shè)價(jià)格淘寶關(guān)鍵詞優(yōu)化軟件
  • 微信二維碼烏魯木齊seo
  • 百度免費(fèi)做網(wǎng)站友情鏈接格式
  • 請(qǐng)簡(jiǎn)述網(wǎng)站開(kāi)發(fā)的流程圖南寧百度seo排名
  • 泉州專(zhuān)業(yè)做網(wǎng)站免費(fèi)推廣引流app
  • 商城網(wǎng)站建設(shè)怎么收費(fèi)企業(yè)網(wǎng)絡(luò)規(guī)劃設(shè)計(jì)方案
  • 手機(jī)app微信網(wǎng)站品牌策劃運(yùn)營(yíng)公司
  • 店鋪推廣方法網(wǎng)站優(yōu)化排名軟件網(wǎng)站
  • 東營(yíng)做網(wǎng)站seo5118營(yíng)銷(xiāo)大數(shù)據(jù)
  • 游戲釣魚(yú)網(wǎng)站怎么做seo高級(jí)
  • dw怎么做自我展示網(wǎng)站類(lèi)似凡科建站的平臺(tái)
  • 濟(jì)寧網(wǎng)站制作發(fā)布信息的免費(fèi)平臺(tái)有哪些
  • 國(guó)外搜索引擎網(wǎng)址網(wǎng)站推廣優(yōu)化怎么做最好
  • 龍華建站公司b站視頻推廣網(wǎng)站2023年
  • 深圳微信網(wǎng)站建設(shè)公司網(wǎng)絡(luò)營(yíng)銷(xiāo)專(zhuān)業(yè)就業(yè)方向
  • 做外貿(mào)哪幾個(gè)網(wǎng)站好如何做網(wǎng)站推廣私人
  • 網(wǎng)站公司哪家好哪家網(wǎng)站推廣好
  • 網(wǎng)站開(kāi)發(fā)應(yīng)用技術(shù)專(zhuān)業(yè)一站式網(wǎng)站設(shè)計(jì)
  • 做網(wǎng)站的圖片新網(wǎng)站百度多久收錄
  • 國(guó)外購(gòu)物獨(dú)立網(wǎng)站建設(shè)全國(guó)人大常委會(huì)
  • 麗水網(wǎng)站建設(shè)拉新推廣一手接單平臺(tái)
  • 西安網(wǎng)站開(kāi)發(fā)百度圖片查找
  • 保定設(shè)計(jì)網(wǎng)站建設(shè)網(wǎng)址查詢服務(wù)器地址
  • 企業(yè)網(wǎng)站服務(wù)器租用平臺(tái)優(yōu)化
  • 網(wǎng)站標(biāo)簽怎么做嘉興百度快照優(yōu)化排名