命名空間
用以區(qū)分不同庫中相同名稱的函數(shù)、類、變量等。本質(zhì)上,命名空間就是定義了一個(gè)范圍,使用了命名空間即定義了上下文。
//定義命名空間
namespace namespace_name {
// 代碼聲明
}
//使用命名空間,注意和類進(jìn)行區(qū)別啊
name::code; // code 可以是變量或函數(shù)
eg:
// 調(diào)用第一個(gè)命名空間中的函數(shù)
first_space::func();
// 調(diào)用第二個(gè)命名空間中的函數(shù)
second_space::func();
:: 叫作用域區(qū)分符,指明一個(gè)函數(shù)屬于哪個(gè)類或一個(gè)數(shù)據(jù)屬于哪個(gè)類。
- 可以用在類聲明其中的函數(shù)、變量等
double Box::getVolume(void){ *** } - 可以用來引用類的靜態(tài)成員和方法
- 可以用來引用命名空間中的函數(shù)、類、變量等,嵌套的命名空間
using 指令
可以使用 using namespace 指令,這樣在使用命名空間時(shí)就可以不用在前面加上命名空間的名稱。這個(gè)指令會(huì)告訴編譯器,后續(xù)的代碼將使用指定的命名空間中的名稱。
#include <iostream>
//使用std命名空間
using namespace std;
//using 指令也可以用來指定命名空間中的特定項(xiàng)目,相當(dāng)于java的靜態(tài)導(dǎo)入
using std::cout;
// 第一個(gè)命名空間
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二個(gè)命名空間
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main ()
{
// 調(diào)用第一個(gè)命名空間中的函數(shù)
func();
return 0;
}
不連續(xù)的命名空間
命名空間可以定義在幾個(gè)不同的部分中,一個(gè)命名空間的各個(gè)組成部分可以分散在多個(gè)文件中。
如果定義的時(shí)候,發(fā)生了命名空間的嵌套,可以使用如下的形式引用其他命名空間
using namespace first_space::second_space;
C++ 預(yù)處理器
預(yù)處理器是一些指令,它指示編譯器在實(shí)際編譯之前所需完成的預(yù)處理。
所有的預(yù)處理器指令都是以井號(hào)(#)開頭,只有空格字符可以出現(xiàn)在預(yù)處理指令之前。預(yù)處理指令不是 C++ 語句,不會(huì)以分號(hào)(;)結(jié)尾。
常用的預(yù)處理指令
| 指令 | 中文 | 解釋 | 一般形式 | 示例 |
|---|---|---|---|---|
| #define | 宏定義 | 創(chuàng)建符號(hào)常量,該符號(hào)常量通常稱為宏,即定義宏常量 | #define macro-name replacement-text | #define PI 3.14159 |
| 參數(shù)宏 | 定義帶參數(shù)的宏,類比inline | #define macro-name(paras list) condition-return | #define MIN(a,b) (a<b ? a : b) | |
| #ifdef #endif | 條件編譯 | 有選擇地對部分程序源代碼進(jìn)行編譯 | #ifdef #endif \n #ifndef #endif | #ifdef NULL #define NULL 0 #endif |
宏常量
#define DEBUG
#define PI 3.14159
#define MIN(a,b) (a<b ? a : b)
int main ()
{
int i, j;
i = 100;
j = 30;
cout <<"較小的值為:" << MIN(i, j) << endl;
//如果在指令 #ifdef DEBUG 之前已經(jīng)定義了符號(hào)常量 DEBUG,則會(huì)編譯 cerr 語句
#ifdef DEBUG
cerr <<"Variable x = " << x << endl;
#endif
//可以用來注釋代碼
#if 0
/* 這是注釋部分 */
//不進(jìn)行編譯的代碼
#endif
return 0;
}
C++ 中的預(yù)定義宏
C++ 提供了下表所示的一些預(yù)定義宏:
| 宏 | 描述 |
|---|---|
| __LINE__ | 這會(huì)在程序編譯時(shí)包含當(dāng)前行號(hào)。 |
| __FILE__ | 這會(huì)在程序編譯時(shí)包含當(dāng)前文件名。 |
| __DATE__ | 這會(huì)包含一個(gè)形式為 month/day/year 的字符串,它表示把源文件轉(zhuǎn)換為目標(biāo)代碼的日期。 |
| __TIME__ | 這會(huì)包含一個(gè)形式為 hour:minute:second 的字符串,它表示程序被編譯的時(shí)間。 |
int main ()
{
cout << "Value of __LINE__ : " << __LINE__ << endl;
cout << "Value of __FILE__ : " << __FILE__ << endl;
cout << "Value of __DATE__ : " << __DATE__ << endl;
cout << "Value of __TIME__ : " << __TIME__ << endl;
return 0;
}
輸出
Value of __LINE__ : 21
Value of __FILE__ : /home/rentianxin/AndroidStudioProjects/RichyDemo/unix/cppdemo/main.cpp
Value of __DATE__ : Mar 23 2019
Value of __TIME__ : 17:02:13
__attribute__ 屬性
GNU C的特色,__attribute__機(jī)制。函數(shù)屬性(Function Attribute),可以幫助開發(fā)者把一些特性添加到函數(shù)聲明中,從而使編譯器在錯(cuò)誤檢查方面的功能更強(qiáng)大。也可以用來提高應(yīng)用程序的兼容性。
attribute機(jī)制也很容易同非GNU應(yīng)用程序做到兼容。
__attribute__可以設(shè)置函數(shù)屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。
__attribute__書寫,以前的寫法是 雙-單-雙 線,例如 __attribute_pure__,現(xiàn)在的使用()
__attribute__語法格式為:_attribute_(xxx)
其位置約束為:放于聲明的尾部“;”之前。
#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
# 和 ## 運(yùn)算符--了解就行
# 和 ## 預(yù)處理運(yùn)算符在 C++ 和 ANSI/ISO C 中都是可用的。
# 運(yùn)算符會(huì)把 replacement-text 令牌轉(zhuǎn)換為用引號(hào)引起來的字符串。
## 運(yùn)算符用于連接兩個(gè)令牌。
異常處理
try、catch、throw。
#include <iostream>
using namespace std;
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
int main ()
{
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
}catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
C++ 標(biāo)準(zhǔn)的異常
也可以通過繼承和重載 exception 類來定義新的異常。