C++命名空間和缺省參數介紹

一、命名空間

為什麼引入命名空間

在C++中,變量、函數和類都是大量存在的,這些變量、函數和類的名稱將都存在於全局作用域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染,namespace關鍵字的出現就是針對這種問題的。

    int a = 10;
    
    int main(void)
    {
        int a = 10;
        return 0;
    }

這裡一個a是全局變量,一個a是局部變量。可以編譯通過。

在這裡插入圖片描述

	int a = 10;
	int a = 20;
	
	int main(void)
	{
		int a = 10;
		return 0;
	}

當有兩個全局變量a時,命名沖突瞭,編譯不過。

在這裡插入圖片描述

舉例說明,假如1班和2班都有名字叫張三的同學,當一班和二班站在一起時,老師叫張三就會出現歧義,不知道叫的是一班的還是二班的。但是如果老師叫一班的張三或二班的張三,就不會出現歧義和錯誤。這裡的一班和二班就相當於命名空間。

命名空間定義

定義命名空間,需要使用到namespace關鍵字,後面跟命名空間的名字,然後接一對{}即可,{}中即為命名空間的成員。

    namespace bc    //bc為命名空間的名字
    {
        //命名空間的成員
        int a = 100;    
        int ADD(int a, int b)
        {
            return a + b;
        }
    }

命名空間中的內容,可以是類、變量、函數、模板和其它命名空間。

命名空間可以嵌套

    namespace FPX
    {
        int a = 5;
        namespace doinb
        {
            int b = 5;
            void Champion()
            {
                cout << "FPX2021WIN" << endl;         
            }
        }
    }

同一個工程中允許存在多個相同名稱的命名空間,編譯器最後會合成同一個命名空間中。
同時也意味著在名字相同的命名空間中的命名是不能沖突的。

使用命名空間

有以下命名空間:

  

  namespace bc
    {
        int m = 10;
        int n = 20;
    
        int Add(int a, int b)
        {
            return a + b;
        }
    
        int Max(int a, int b)
        {
            return a > b ? a : b;
        }
    }

1.使用using聲明將命名空間全部展開到全局。

    using namespace bc;

這樣命名空間中的內容就可以像全局一樣直接使用。

    int a = 10;
    int b = 20;
    cout << Add(a, b) << endl;
    cout << Max(a, b) << endl;

這種方法的優點是使用起來非常方便,缺點是把自己的定義都暴露出去瞭,導致命名污染。

2.訪問命名空間的內容時,指定命名空間。

    int a = 10;
    int b = 20;
    cout << bc::Add(a, b) << endl;
    cout << bc::Max(a, b) << endl;

::為作用域運算符,前綴bc::指出函數Add和Max是定義在名為bc的命名空間中的。通過作用域運算符(::)來指出我們想使用定義在命名空間bc中的名字Add和Max。
這種方法的優點是不存在命名污染,缺點是用起來太麻煩,每個都要去指定命名空間。

3.可以把常用的展開

比如Add函數是常用的:

    using bc::Add;

以後使用Add函數時就不需要指定命名空間。
這種方法不會造成大面積的命名污染,把常用的展開,使用時也很方便。
位於頭文件的代碼一般來說不應該使用using聲明。因為頭文件的內容會拷貝到所有引用它的文件中,如果頭文件裡有某個using聲明,那麼每個使用瞭該頭文件的文件就都會有這個聲明。對於某些程序來說,由於不經意間包含瞭一些名字,反而可能產生名字沖突。

標準命名空間

C++ 引入瞭命名空間的概念,計劃重新編寫庫,將類、函數、宏等都統一納入一個命名空間,這個命名空間的名字就是std。std 是 standard 的縮寫,意思是“標準命名空間”。

二、缺省參數

缺省參數概念

缺省參數是聲明或定義函數時為函數的參數指定一個默認值。在調用該函數時,如果沒有指定實參則采用該默認值,否則使用指定的實參。

  

 void TestFunc(int a = 0)    //參數缺省值
    {
        cout << a << endl;
    }
    
    int main(void)
    {
        TestFunc();        //沒有傳參數,使用參數的默認值
        TestFunc(10);    //傳參數時,使用指定的參數
        return 0;
    }

在這裡插入圖片描述

三、缺省參數分類

全缺省參數

所有的參數都給出缺省值:

    void TestFunc(int a = 10, int b = 20, int c = 30)
    {
        cout << "a = " << a << endl;
        cout << "b = " << b << endl;
        cout << "c = " << c << endl;
    }

半缺省參數

部分參數給出缺省值:

    void TestFunc(int a, int b = 10, int c = 20)
    {
        cout << "a = " << a << endl;
        cout << "b = " << b << endl;
        cout << "c = " << c << endl;
    }

需要註意的是:

半缺省參數必須從右往左依次來給出,不能間隔著給。
缺省參數不能在函數聲明和定義中同時出現。
缺省值必須是常量或者全局變量。

 到此這篇關於C++命名空間和缺省參數介紹的文章就介紹到這瞭,更多相關C++命名空間和缺省參數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: