命名空間解決全域性命名衝突的問題
標準c++庫中的所有元件都是在乙個被稱為std的名字空間中宣告和定義的。在 採用標準c++的平台上使用標準c++庫中的元件,只要寫乙個using指示符: using namespace std; 就可以直接使用標準c++庫中的所有成員。 或者 std::成員 的方式也可以使用c++庫里的成員
#include
using
namespace
std;
int max = 10;
int main()
**會編譯錯誤。因為std空間裡定義了同名的max。
namespace用法:
using namespace 空間名,缺點是不能再定義和命名空間相同的變數
空間名::變數,不會和其他空間衝突但寫起來麻煩
在同一作用域裡,一組函式的函式名相同,引數列表不同(個數不同/型別不同)
因為c語言目標檔案的符號表如果有相同的函式名稱就會造成衝突。
編譯過程:c++編譯生成的符號表時,函式名會加上它的引數資訊,所以如果同名函式引數不同,符號表的key就不同。稱為c++函式名修飾。
這樣在呼叫同名函式時,在編譯期間就能通過函式實參去查符號表,呼叫不同的同名函式。
linux使用objdump檢視符號表可以觀察函式名規則。
int add(int a = 1, int b =2)
int add(int a, int b = 2, int c = 3)
只能從右往左進行預設賦值。
定義引用
int a = 10; int& b = a;
a是乙個變數名稱,b是a這個變數的第二個別名,兩者位址相同。
引用規則:
定義引用必須初始化
乙個變數可以有多個別名
只能初始化一次,不能再改變引用指向
const
int a = 10;
int& b = a; //許可權放大,不能編譯通過
const
int& b = a; //正確
const
int& c = 10; //常量取個別名
int x = 10;
double d = x; //隱式型別轉換
const
double& e = x; //x轉換到double有個臨時變數,e就是對臨時變數取的別名
const修飾作用,看const和*的相對位置
int a = 10;
const
int *p1 = &a; //指標指向內容不能更改
int *p2 = p1; //許可權放大
int* const p3; //p3的指向不能改變
int* p4 = p3; //正確,不會影響p3的指向
形參是實參的別名,指的是同一塊記憶體空間
//引用
void swap(int& a, int& b)
//傳值
void swap(int a, int b)
//傳址
void swap(int *a, int *b)
傳址和傳址都會在棧中壓入臨時變數,看似引用沒有建立臨時變數,其實在底層引用也是利用指標的原理。
int& add(int& a, int& b)
int main()
也就是說上述引用返回值是錯誤的,引用的值是棧空間上的。
假設返回的引用物件出了當前函式的作用域依舊存在,則可以返回引用。
指標和引用的區別聯絡:
引用的使用方式像值傳遞,性質像址傳遞。
引用只能在定義時初始化一次,之後不能改變指向其它變數;指標變數的值可變。
引用必須指向有效的變數,指標可以為空。 所以不會出現引用判空的情況,引用比指標更安全。
sizeof,++,–意義不一樣。
C 命名空間 函式過載 引用 內聯函式
c 關鍵字 c 98 有63個 命名空間解決了 名字衝突,有作用域的作用 命名空間的使用格式 namespace n1使用方法 1.n1 變數 2.using n1 變數 3.using namespace n1 c 的輸入輸出 標頭檔案 iostream 命名空間 using namespace ...
C 筆記 函式過載 引用 命名空間
引用 引用在定義時必須初始化 乙個變數可以有多個引用 引用一旦引用乙個實體,再不能引用其他實體 int a 10 int ra a cout a a cout ra ra endl ra 20函式 函式過載 函式過載 是函式的一種特殊情況,c 允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函...
C 過載 預設 命名空間
剛學習c 入門階段對過載 預設 命名空間的理解 c幾乎是c 的乙個子集,所以c語言支援的語法在c 基本都支援並需要使 用。c plus plus c 所以在c的基礎上又有了很多新的特性 過載 下面看兩組函式,分別是用c和c 寫的列印函式,分別列印 int 型 char 型 string 型 c要完成...