c++——::scope, пространство имен, использование (директива объявления и компиляции)

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.

Guess you like

Origin blog.csdn.net/qq_57737603/article/details/132309530