類型轉換
const_cast 用於去除指針變量的常屬性,將它轉換爲一個對應指針類型的普通變量,反過來也可以將一個非常量指針轉換爲一個常量指針變量
static_cast 用於轉換基本類型和具有繼承關係的類新之間轉換,不太用於指針類型的之間的轉換
dynamic_cast 只能在繼承類對象的指針之間或引用之間進行類型轉換
原來C++標識符的作用域分成三級:代碼塊({……},如複合語句和函數體)、類和全局。現在,在其中的類和全局之間,標準C++又添加了命名空間這一個作用域級別。
命名空間可以是全局的,也可以位於另一個命名空間之中,但是不能位於類和代碼塊中。所以,在命名空間中聲明的名稱(標識符),默認具有外部鏈接特性(除非它引用了常量)。
在所有命名空間之外,還存在一個全局命名空間,它對應於文件級的聲明域。因此,在命名空間機制中,原來的全局變量,現在被認爲位於全局命名空間中。
標準C++庫(不包括標準C庫)中所包含的所有內容(包括常量、變量、結構、類和函數等)都被定義在命名空間std(standard標準)中了。
定義命名空間
有兩種形式的命名空間——有名的和無名的。
命名空間的定義格式爲:(取自C++標準文檔)
named-namespace-definition:
namespace identifier { namespace-body }
unnamed-namespace-definition:
namespace { namespace-body }
namespace-body:
declaration-seqopt
即:
有名的命名空間:
namespace 命名空間名 {
聲明序列可選
}
無名的命名空間:
namespace {
聲明序列可選
}
命名空間的成員,是在命名空間定義中的花括號內聲明瞭的名稱。可以在命名空間的定義內,定義命名空間的成員(內部定義)。也可以只在命名空間的定義內聲明成員,而在命名空間的定義之外,定義命名空間的成員(外部定義)。
命名空間成員的外部定義的格式爲:
命名空間名::成員名 ……
例如:
// out.h
namespace Outer { // 命名空間Outer的定義
int i; // 命名空間Outer的成員i的內部定義
namespace Inner { // 子命名空間Inner的內部定義
void f() { i++; } // 命名空間Inner的成員f()的內部定義,其中的i爲Outer::i
int i;
void g() { i++; } // 命名空間Inner的成員g()的內部定義,其中的i爲Inner::i
void h(); // 命名空間Inner的成員h()的聲明
}
void f(); // 命名空間Outer的成員f()的聲明
// namespace Inner2; // 錯誤,不能聲明子命名空間
}
void Outer::f() {i--;} // 命名空間Outer的成員f()的外部定義
void Outer::Inner::h() {i--;} // 命名空間Inner的成員h()的外部定義
// namespace Outer::Inner2 {/*……*/} // 錯誤,不能在外部定義子命名空間
注意:
不能在命名空間的定義中聲明(另一個嵌套的)子命名空間,只能在命名空間的定義中定義子命名空間。
也不能直接使用“命名空間名::成員名 ……”定義方式,爲命名空間添加新成員,而必須先在命名空間的定義中添加新成員的聲明。
另外,命名空間是開放的,即可以隨時把新的成員名稱加入到已有的命名空間之中去。方法是,多次聲明和定義同一命名空間,每次添加自己的新成員和名稱。例如:
namespace A {
int i;
void f();
} // 現在A有成員i和f()
namespace A {
int j;
void g();
} // 現在A有成員i、f()、j和g()
還可以用多種方法,來組合現有的命名空間,讓它們爲我所用。例如:
namespace My_lib {
using namespace His_string;
using namespace Her_vector;
using Your_list::List;
void my_f(String &, List &);
}
使用:
using namespace My_lib;
2, 在C++中,在類的內部定義了函數體的函數,被默認爲是內聯函數。而不管你是否有inline關鍵字。
3, 內聯函數在C++類中,應用最廣的,應該是用來定義存取函數。我們定義的類中一般會把數據成員定義成私有的或者保護的,這樣,外界就不能直接讀寫我們類成員的數據了。對於私有或者保護成員的讀寫就必須使用成員接口函數來進行。如果我們把這些讀寫成員函數定義成內聯函數的話將會獲得比較好的效率.
4, 內聯函數也有一定的侷限性。就是函數中的執行代碼不能太多了,如果,內聯函數的函數體過大,一般的編譯器會放棄內聯方式,而採用普通的方式調用函數。
2.一個類的成員函數作爲另一個類的友元函數時,必須先定義這個類。
3.友元關係是單向的,不具有交換性.若類A是類B了的友元,並不代表類B是類A的友元.友元關係也不具有傳遞性.
4.友元函數的作用:1.提高了程序的運行效率.2.實現類之間的數據共享
5.缺點:破壞了數據的隱蔽性和封裝性.