命名空間
- 在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語言不支援