c++ 作用域和名字控制
一、::(雙冒號) 作用域
<::>運算符是一個作用域如果<::>前面什么都沒有加 代表是全局作用域
二、命名空間(namespace)
1、namespace
本質是作用域,可以更好的控制標識符的作用域命名空間 就可以存放 變量 函數 類 結構體 …
2、命名空間的使用
1、命令空間的定義:必須定義在全局范圍
2、命名空間下可以存放 變量函數 結構體 類
3、命名空間可以重名 重名的命名空間相當于做合并4、操作命名空間可以嵌套命名空間
5、命名空間可以取別名
6、命名空間可以沒有名字
7、命名空間中的函數可以先聲明,在外部定義。定義時需要加上命名空間作用域
#include <iostream>
using namespace std;namespace A
{int a = 10;void fun(){cout << "hello namespace" << endl;}void function(int val);
}
void A :: function(int val){cout << "hello function" <<endl;
}
namespace B
{int a = 10;int b = 20;
}
namespace C
{int a = 20;namespace D{int a = 10;}
}void print(){cout << "namespaceA a = " << A :: a <<endl;cout << "namespaceB a = " << B :: a << endl;cout << "namespaceB b = " << B :: b << endl;A :: fun();cout << "namespaceD a = " << C :: D :: a << endl;
}int main(){print();
}
3、無名字的命名空間
如果命名空間沒有名字那么這個命名空間內的所有成員都被編譯器加上了static修飾
只能被當前文件調用 這個屬于內部鏈接屬性
namespace{
int a=10:
void func(){cout << "hello namespace" << endl:}
4、命名空間取別名
namespace newname = oldname;
三、using聲明和using編譯指令
1、using聲明:
如果在某個空間內的變量過對象或函數要頻繁的訪問,不想次次都要加上::(雙冒號作用域)時就可以用到using聲明。
#include <iostream>
using namespace std;
namespace A
{int a = 100;void index(){cout << "hello" << endl;}
}void fun(){
//多次訪問A下面的a舊的加上作用域::cout << A :: a << endl;cout << A :: a << endl;cout << A :: a << endl;//那可以用using來聲明解決不要每次都要寫這個作用域using A ::a;cout << a << endl;cout << a << endl;cout << a << endl;index();
}int main(){return 0
}
注意:當using聲明的標識符和其他標識符有作用域的沖突時,會產生二義性
void fun(){int a = 10;//errusing A ::a;cout << a << endl;cout << a << endl;cout << a << endl;
}
2、using編譯指令:
使得整個命名空間標識符可用。
namespace nameA
{int a = 10;void fun(){cout << "hello" << endl;}
}void function(){int a = 100;//如果在using編譯指令前也一個相同的變量,就不會像using聲明一樣有沖突。using namespace nameA;//此時a的值是局部變量的值100cout << a << endl;fun();
}
建議用using編譯指令取代using聲明來使用。