1. 程式人生 > >C++知識點---名稱空間、預設引數、過載

C++知識點---名稱空間、預設引數、過載

1.什麼是C++?

  • C++延續了C語言的語法使用,在其基礎上又增加了自己的特性
  • 對於C++而言,可以進行過程化的設計,也可以根據抽象資料型別的特點,將其認為是某一物件,基於這種物件進行程式設計

2. C++與C語言的差異

  • 資料型別:從基本資料型別來看,C++增加了邏輯型bool;從自定義型別來看,C++增加了類
  • 關鍵字:C語言的關鍵字只有32個,C++在此基礎上將關鍵字增加到98個關鍵字
  • 命名衝突:C語言不支援全域性命名衝突的情況(即重新命名);C++存在名字空間域,解決了命名衝突的問題

3. C++中的名稱空間

  • 以關鍵字namespace開始,其後接名稱空間的名字
  • 名稱空間相當於作用域,空間裡的成員,外部訪問時必須指定成員名字存在的作用域中(即名稱空間)
  • ::是作用域解析符,某成員名字屬於哪個作用域;下面的例子中 s1::a;表示a在s1的作用域裡

例:

namespace s1
{
    int a = 10;
}

namespace s2
{
    int a = 20;
}
int main()
{
    cout << s1::a << endl;
    cout << s2::a << endl;
    system("pause");
    return 0;
}

4.預設引數

  • 理解:預設引數指可給函式引數賦值,留做備用,當呼叫函式時,沒有傳參時即可使用設定的引數預設值
  • 規則:設定預設值的引數只能是最後的幾個引數。也就是說某一個引數一旦設定了預設值,其後而的引數也必須設定預設值。

    例:

int Add1(int x, int y, int z)//沒有預設值
{
    return x + y + z;
}

int Add2(int x, int y, int z = 3)//半預設
{
    return x + y + z;
}
int Add3(int x = 1, int y = 2, int z = 3)//全預設
{
    return x + y + z;
}
int
Add4(int x, int y = 2, int z)//錯誤 { return x + y + z; } int main() { cout << Add1(3,6,9) << endl; cout << Add2(6,7) << endl; cout << Add3() << endl; system("pause"); return 0; }

5.函式過載

5.1 什麼是函式過載

在同一作用域內,一組函式的函式名相同引數列表不同(個數不同/型別不同),返回值可同可不同

例如:
void Func1(int a);
void Func1(int a,double c);
int Func1(double c,int a);
這幾個函式即為函式過載;和返回值無關,函式名相同,對應引數不同,引數個數也不相同

5.2 為什麼需要函式過載

根據函式過載的定義可從函式過載的幾個特點來分析:

  • 函式名相同:在C語言的語法中,同一作用域中不允許函式名重複,那麼在實現一個功能時就需要定義多個函式,例如:1+2,1+2+3,1.0+2.0+3.0+4.0,雖然這些加法只是個數不同,型別不同,但在呼叫函式就不能使用同一函式名,因此為了減少工作量,引入函式過載可解決這一問題
  • 引數不同:上面的例子只是引數列表(型別,個數)不同,故相同功能的函式只需要設計不同的引數即可

    幾個例子

  int Add(int x, int y)
{
    return x + y;
}

double Add(double x, double y)
{
    return x + y;
}

int Add(int x, int y, double z)
{
    return x + y + z;
}
int main()
{
    cout << Add(1, 2) << endl;
    cout << Add(3.0, 4.0) << endl;
    cout << Add(1, 2,3.0) << endl;

    system("pause");
    return 0;
}

結果:

這裡寫圖片描述

分析:
上述例子中存在函式過載,幾個Add函式實現相同的功能,不會發生命名重複等諸多情況,都能得到相應的結果

5.3 C++支援過載的原因

在說明這個問題之前,我們在linux下檢視同一段程式碼分別用C語言編譯和C++編譯時的彙編程式碼

程式碼:

#include<stdio.h>

int Add(int x,int y)
{
    return x+y;
}

int main()
{
    int ret=Add(1,2);
    printf("%d",ret);
    return 0;
}

C語言:

這裡寫圖片描述

C++:

這裡寫圖片描述

分析:

  1. 從上圖中可以看出,C++在呼叫函式時Add函式名已經改變<_Z3Addii>, 不僅僅是函式名,還有引數的型別,而C語言呼叫時Add函式名< Add >沒有改變
  2. C語言中一個函式就是一個地址,即使引數不同,也是相同的地址,編譯器不能識別,故而C語言中沒有過載函式的概念
  3. C++中一個函式名可有多個地址,當引數不同時,地址也不相同,編譯器可根據不同的地址去呼叫對應的函式來完成函式的功能,因此C++中支援函式過載的概念

    綜上所述:C++能夠支援過載是因為他有自己的函式名修飾規則,在編譯時可以識別相同函式名,不同引數列表的函式