C++ область действия и управление именами
1. ::(двойное двоеточие) область действия
Оператор <::> является областью действия. Если перед <::> ничего нет, это означает, что это глобальная область действия.
2. Пространство имен (пространство имен)
1、пространство имен
Суть в области видимости. Пространство имен области, которое может лучше контролировать идентификатор, может хранить структуру класса переменной функции...
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. Пространство имен без имени
Если пространство имен не имеет имени, то все члены в пространстве имен оформляются компилятором статически и
могут быть вызваны только текущим файлом.Это атрибут внутренней ссылки.
namespace{
int a=10:
void func(){
cout << "hello namespace" << endl:
}
4. Псевдонимы пространства имен
namespace newname = oldname;
3. оператор 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
}
Примечание . Когда идентификатор, объявленный с использованием, конфликтует с другими идентификаторами в области действия, возникает неоднозначность.
void fun(){
int a = 10;//err
using A ::a;
cout << a << endl;
cout << a << endl;
cout << a << endl;
}
2. использование директивы компиляции:
делает доступным весь идентификатор пространства имен.
namespace nameA
{
int a = 10;
void fun(){
cout << "hello" << endl;
}
}
void function(){
int a = 100;
//如果在using编译指令前也一个相同的变量,就不会像using声明一样有冲突。
using namespace nameA;
//此时a的值是局部变量的值100
cout << a << endl;
fun();
}
Вместо оператора using рекомендуется использовать директиву компилятора using.