天天看點

C++命名空間和預設參數的概念

命名空間

  • 在C/C++中,變量、函數和後面要學到的類都是大量存在的,這些變量、函數和類的名稱将都存在于全局作用域中,可能會導緻很多沖突。使用命名空間的目的是對辨別符的名稱進行本地化,以避免命名沖突或名字污染,namespace 關鍵字的出現就是針對這種問題的。
  • 1 、命名空間定義
    • 定義命名空間,需要使用到namespace關鍵字,後面跟命名空間的名字,然後接一對{}即可,{}中即為命名空間的成員。
//1. 普通的命名空間
    namespace N1 // N1為命名空間的名稱
    {
	    // 命名空間中的内容,既可以定義變量,也可以定義函數
	    int a;
	    int Add(int left, int right)
	    {
	   		 return left + right;
	    }
    }
           

//2. 命名空間可以嵌套

namespace N2
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace N3
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}
           
//3. 同一個工程中允許存在多個相同名稱的命名空間
// 編譯器最後會合成同一個命名空間中。
namespace N1
{
	int Mul(int left, int right)
	{
		return left * right;
	}
}
           
  • 注意:一個命名空間就定義了一個新的作用域,命名空間中的所有内容都局限于該命名空間中
  • 2 、命名空間使用
  • 命名空間中成員該如何使用呢?比如:
namespace N
{
	int a = 10;
	int b = 20;
	
	int Add(int left, int right)
	{
		return left + right;
	}
	
	int Sub(int left, int right)
	{
		return left - right;
	}
}

int main()
{
	printf("%d\n", a); // 該語句編譯出錯,無法識别a
	return 0;
}
           
  • 命名空間的使用有三種方式:
    • 加命名空間名稱及作用域限定符
      int main()
      {
      	printf("%d\n", N::a);
      	return 0;
      }
                 
  • 使用using将命名空間中成員引入
    using N::b;
    int main()
    {
    	printf("%d\n", N::a);
    	printf("%d\n", b);
    	return 0;
    }
               
  • 使用using namespace 命名空間名稱引入
using namespce N;
int main()
{
	printf("%d\n", N::a);
	printf("%d\n", b);
	Add(10, 20);
	return 0;
}
           

預設參數

  • 預設參數概念:預設參數是聲明或定義函數時為函數的參數指定一個預設值。在調用該函數時,如果沒有指定實參則采用該預設

    值,否則使用指定的實參。

void TestFunc(int a = 0)
{
	cout<<a<<endl;
}

int main()
{
	TestFunc(); // 沒有傳參時,使用參數的預設值
	TestFunc(10); // 傳參時,使用指定的實參
}
           
  • 預設參數分類
    • 1、全預設參數
void TestFunc(int a = 10, int b = 20, int c = 30)
{
	cout<<"a = "<<a<<endl;
	cout<<"b = "<<b<<endl;
	cout<<"c = "<<c<<endl;
}
           
- 2、半預設參數
           
void TestFunc(int a, int b = 10, int c = 20)
{
	cout<<"a = "<<a<<endl;
	cout<<"b = "<<b<<endl;
	cout<<"c = "<<c<<endl;
}
           
  • 注意:
  • 半預設參數必須從右往左依次來提供,不能間隔着給出
  • 預設參數不能同時在函數聲明和定義中出現,隻能二者擇其一,也就是說必須在函數調用之前将預設值的資訊通知編譯系統。由于編譯是從上到下的逐行執行的,如果在函數調用之前未得到預設值資訊,在編譯到函數調用時,就會認為參數個數與形參個數不比對而報錯。如果在聲明函數已對形參給出了預設值,而在定義函數時又對形參給出預設值,有的編譯系統會給出“重複指定預設值”的報錯資訊,有的編譯器對此不報錯,甚至允許在聲明和定義時給出的預設值不同,此時編譯系統以先遇到的為準。由于函數聲明在函數定義之前,是以以聲明時給出的預設值為準,而忽略定義函數時給出的預設值。
  • 預設值必須是常量或者全局變量
  • 一個函數不能做重載函數,有作為有預設參數的函數。因為當調用函數時如果少寫一個參數,系統就無法判定是重載函數還是利用預設參數的函數,出現二義性,系統無法執行。
  • C語言不支援

繼續閱讀