-
命名空間
c/c++中,變量、函數以及類的名稱都是 存在於全局作用域中,可能會導致很多衝突。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名衝突或名字污染。需要用到的關鍵字:namespace。1.1 定義命名空間:namespace後面跟命名空間的名字,然後接{ },{ }中位命名空間的成員。
namespace N //N爲空間的名稱
{
//在命名空間中,既可以定義變量,也可以定義函數
int a;
int add(int x,int y)
{
return x+y;
}
}
//命名空間的嵌套
namespace A
{
int a;
int add(int x, int y)
{
return x+y;
}
namespace B
{
int b;
int sub(int x, int y)
{
return x-y;
}
}
}
//同一個工程中允許存在相同名稱的命名空間,編譯器最後會合成一個命名空間中
namespace N
{
int mul(int x , int y )
{
return x*y;
}
}
//***一個命名空間就定義了一個新的作用域,命名空間中的所有內容都限於該命名空間中***
2.2 命名空間的使用
首先定義一個命名空間
namespace N
{
int a = 2;
int add(int x, int y)
{
return x + y;
}
}
在主函數中使用:
會出現錯誤;
所以在主函數中不能直接使用,這裏列舉命名空間使用的三個方法:
a、加命名空間名稱以及作用域限定符
int main()
{
printf("%d",N::a);
system("pause");
return 0;
}
b、使用using將命名空間中成員引入
using N::a;
int main()
{
printf("%d",a);
system("pause");
return 0;
}
c、使用usingnamespace命名空間名稱引入
using namespace N;
int main()
{
printf("%d\n",a);
printf("%d",add(a, 20));
system("pause");
return 0;
}
- 輸入輸出
cin>>;
cout<<;
使用標準輸出和標準輸入時,必須包含頭文件以及std標準命名空間;
#include<iostream>
using namespace std;
int main()
{
int a;
int b;
int c = 28;
cin >> a;
cin >> b;
cout << a << endl;
cout << b << '+' << c <<'='<< b + c << endl;
system("pause");
return 0;
}
- 缺省參數
缺省參數是聲明或定義函數時爲函數的參數指定一個默認值,在調用該函數是,如果沒有指定實參則採用該默認值,否則使用指定的實參。
void test(int a = 7)
{
cout << a << endl;
}
int main()
{
test(); //沒有傳參,使用默認值
test(0); //有傳參,使用指定的實參
return 0;
}
缺省值的分類:
a、全缺省值
void test(int a = 10, int b = 30,int c = 29)
b、半缺省值
void test(int a , int b =78, int c = 33)
需要注意的是:半缺省參數必須從右往左依次來給出,不能間隔着給;缺省值參數不能在函數聲明和定義中同時出現;缺省值必須常量或者全局變量;c語言不支持;
- 函數重載
概念:函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這些同名函數的形參列表(參數個數 或 類型 或 順序)必須不同,常用來處理實現功能類似數據類型不同的問題;
int add(int a, int b)
{
return a + b;
}
double add(double a , double b)
{
return a + b;
}
long add(long a, long b)
{
return a + b;
}
- 引用
概念:不是新定義一個變量,而是給已存在變量取一個別名,編譯器不會爲醫用變量開闢內存空間,它和它引用的變量公用一快地址空間。
int main()
{
int a = 1;
int& ra = a;
printf("%p\n", &a);
printf("%p", &ra);
return 0;
}
引用的特性:
1、引用在定義時必須初始化;
2、一個變量可以有多個引用;
3、引用一旦引用一個實體,再不能引用其他實體;
使用場景:
1、做參數
void add(int& a ;int& b)
2、做返回值
int& test(int& a){...}
需要注意的是:如果以引用類型返回,返回值的生命週期必須不受函數的限制
引用和指針的區別:
1、在語法上引用就是一個別名,沒有獨立的空間,在底層上實際是有空間的,因爲引用是按照指針方式來實現的
2、引用必須初始化,指針不需要
3、引用在初始化時引用一個實體後,就不能再引用其他實體;而指針可以在任何時候指向任何一個同類型實體
4、沒有NULL引用,有NULL指針
5、sizeof計算引用類型的大小,指針是地址空間所佔字節大小
6、有多級指針,沒有多級引用
7、指針需要顯示解引用,引用編譯器自己處理
8、引用比指針更安全
- 內聯函數
概念:以inline修飾的函數叫做內聯函數,編譯時C++編譯器會調用內聯函數的地方展開,沒有函數壓棧的開銷,內聯函數提升程序運行效率;
特點:以空間換時間,遞歸和循環不適用;編譯器自動選擇是否優化;不建議分離申明和定義;