Пространство имен пространства имен базовых знаний C++

Мотивация пространства имен

При разработке крупных проектов используется множество самостоятельно разработанных библиотек.Вполне вероятно, что в разных библиотеках будут функции или шаблоны с одинаковыми именами.Конечно, этого можно избежать, увеличив сложность именования, но это Это не очень хорошая идея, поэтому пространство имен возникает спонтанно.Он может разрешать конфликты имен, разделяя глобальное пространство имен на области видимости, чтобы избежать загрязнения пространства имен .
Простой пример:

Пространство имен создается следующим образом:

namespace namespace name {
//members
}

namespace GUi{
    
    
	class Windows;
}
namespace statistics{
    
    
	class Windows;
}

Хотя имена членов в двух пространствах имен одинаковы, области действия разных пространств имен различаются, поэтому конфликтов не будет.

std::cin std::cout std::endl

Новички в C++ должны быть знакомы с тремя приведенными выше предложениями.

Сначала распознайте оператора: ::оператор домена

::Смысл оператора домена: найти имя справа от области, обозначенной именем слева от оператора домена, то есть
использовать std::cinимя cin в пространстве имен std

std — это пространство имен, которое можно использовать с ключевым словом using

Мы не добавляем cin cout endl и т.д. в программу по своему желанию std::, потому что мы добавили следующий код в начало программы:

using namespace std;

После добавления этого кода, поскольку имя в пространстве имен std можно использовать напрямую, нет необходимости добавлять специальный префикс. Но на самом деле вначале мы все следовалиКаждое объявление использования вводит член пространства именПринцип возникает, например, при использовании следующего оператора в программе:

std::cout << "你真帅呀阿杜" << std::endl;

Мы все объявляемся по следующему шаблону:

using namespace::name;
(После объявления приведенного выше оператора вы можете использовать имя в пространстве имен namespace)

Прямо сейчас:

using std::cout
using std::endl

Тогда вы можете смело использовать следующий код:

cout << "你真帅呀阿杜" << endl;

Но:
using std::cout;
using std::endl;
Вышеуказанные два объявления могут использоваться только без префикса при использовании cout и endl, но они все равно должны добавлять префикс ( ) при использовании строки в std.Если std::stringвы используете using namespace std;его, он вам не нужен.string

Фактически, форма приведенного выше кода выглядит следующим образом:

namespace std{
    
    
	cin;
	cout;
	endl;
	stirng;
	……
}

int main(void){
    
    
	using namespace std;
	cout << *** << endl;
}

Разница между использованием пространства имен и использованием

В C++ using namespaceи usingэто два разных способа использования пространств имен.

Технический термин:
using namespaceвызывается с помощью инструкции

usingвызывается с помощью инструкции

использование указывает, что все имена в пространстве имен вводятся одновременно

Оператор using может одновременно вводить переменные-члены только в одном пространстве имен.


Например:using namespace org::cyclonedds;

Это способ использования пространств имен для указания пространства имен, используемого в текущей области. Используя using namespace, мы можем опустить префикс пространства имен, который необходимо добавлять при использовании классов, функций и переменных в пространстве имен для упрощения кода.
Для using namespace org::cyclonedds, он org::cycloneddsвводит все члены во всем пространстве имен в текущую область, так что мы можем напрямую использовать классы, функции и переменные в пространстве имен без добавления префикса при его использовании org::cyclonedds.

Народное означает: таким способом объявления org::cyclonedds является пространством имен.

namespace org{
    
    
	namespace cyclonedds{
    
    
		//命名空间中的各种成员,比如A、B、C
		//那么在使用ABC的时候不需要加前缀org::cyclonedds A,直接A就行
	}
}

using org::cyclonedds

Это способ использования определенных членов пространства имен, который указывает, что определенные члены пространства имен используются в текущей области. Используя using,Мы можем выборочно ввести один или несколько членов пространства имен вместо всего пространства имен..
Ибо using org::cycloneddsон только знакомит org命名空间中的一个成员cyclonedds,而不是整个命名空间. так,Мы можем использовать только импортированные определенные члены напрямую, другим непредставленным членам все еще нужно добавить соответствующий префикс пространства имен для использования.


Подводя итог, использование пространства имен org::cyclonedds вводит все члены во все пространство имен org::cyclonedds, а использование org::cyclonedds вводит только определенные члены в пространство имен. Оба они могут упростить код и позволить нам напрямую использовать члены в пространстве имен без добавления префикса пространства имен.

Разница между инструкцией использования и оператором использования проверяется на примере

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

int num = 900;
int num1 = 1000;

namespace org{
    
    
        namespace eclipse{
    
    
                namespace duzhognbo{
    
    
                        int num = 100;
                }
        }
}
//自定义的命名空间要在其using namespace之前才行
namespace org1{
    
    
        namespace eclipse1{
    
    
                namespace duzhognbo1{
    
    
                        int num2 = 100;
                        string name = "zhongguo";
                }
        }
}
using namespace org1::eclipse1::duzhognbo1;//只有这么引入才可直接使用name和num2
using org1::eclipse1::duzhognbo1::name;//只是引入了命名空间中的特定成员name,name可直接使用,num2不可
int main(void) {
    
    
        cout << "num = " << num << endl;//num = 900
        cout << "num = " << org::eclipse::duzhognbo::num << endl;// num = 100
        cout << "name = " << name << endl;
        cout << "num2 =" << num2 << endl;
        system("pause");
        return 0;
}

Анализ:
1. cout << "num = " << num << endl;Глобальная переменная num используется для прямых вызовов, а значение num в org::eclipse::duzhognbo::numпространстве имен вызывается только приorg::eclipse::duzhognbo

2. using namespace org1::eclipse1::duzhognbo1Импортировать все элементы в пространстве имен, и любой член в нем не должен иметь префикс, напримерname、num2

3. using org1::eclipse1::duzhognbo1::name;//Просто введите конкретное имя элемента в пространстве имен, name можно использовать напрямую, num2 нельзя

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
//自定义的命名空间要在其using namespace之前才行
namespace org1{
    
    
        namespace eclipse1{
    
    
                namespace duzhognbo1{
    
    
                        int num2 = 100;
                        string name = "zhongguo";
                }
        }
}
using namespace org1::eclipse1;
int main(void) {
    
    
        cout << "name = " << duzhognbo1::name << endl;//name = zhongguo
        cout << "num2 =" << duzhognbo1::num2 << endl;//num2 = 100
        system("pause");
        return 0;
}

using namespace org1::eclipse1; заключается в том, чтобы импортировать org1::eclipse1все члены в это пространство имен, поэтому при доступе к name и num2 duzhognbo1::nameи требуются duzhognbo1::num2.

Подведем итог
1. Пока присутствует ключевое слово using namespace, все элементы определенного пространства имен будут импортированы напрямую
2. Если есть только использование, будут добавлены определенные члены
3. Если нет использования или использования пространства имен, используйте org1: :eclipse1 непосредственно в программе: форма :duzhognbo1::name указывает на то, что доступ к членам в пространстве имен осуществляется напрямую, и не вводятся какие-либо определенные члены или все члены.

Примеры общего использования пространства имен

1. Основное использование:

namespace MyNamespace {
    
    
    int x;
    void func() {
    
    
        // 函数实现
    }
}
int main() {
    
    
    MyNamespace::x = 10;
    MyNamespace::func();
    return 0;
}

2. Вложенное пространство имен (обратите внимание на метод доступа)

namespace Outer {
    
    
    int x;
    namespace Inner {
    
    
        int y;
    }
}
int main() {
    
    
    Outer::x = 10;
    Outer::Inner::y = 20;
    return 0;
}

3. Используйте псевдоним

namespace MyNamespace {
    
    
    int x;
    void func() {
    
    
        // 函数实现
    }
}
namespace ns = MyNamespace;
int main() {
    
    
    ns::x = 10;
    ns::func();
    return 0;
}

namespace ns = MyNamespace; Вы можете дать сложному пространству имен краткое имя ns

Конечно, вы также можете создавать псевдонимы для вложенных пространств имен.

пространство имен MyNamespace { пространство имен MyNamespace222 {

}}
namespace ns = MyNamespace::MyNamespace222;

4. Расширение пространства имен

namespace MyNamespace {
    
    
    int x;
}
namespace MyNamespace {
    
      // 扩展命名空间
    void func() {
    
    
        // 函数实现
    }
}
int main() {
    
    
    MyNamespace::x = 10;
    MyNamespace::func();
    return 0;
}

Уведомление:

namespace namespace name { // члены }

Объявления, которые создают новое пространство имен или добавляют новых членов в существующее пространство имен.

Использование указывает на решение конфликтов между членами пространства имен и другими переменными.

Пожалуйста, добавьте описание изображения

Все члены в пространстве имен bilp вводятся using namespace blipс помощью кода инструкции использования ( ).В это время j в пространстве повторяется с глобальной переменной j, которая отличается тем, что представляет ::jглобальную переменную и представляет j в пространстве имен.blip::j

Локальная переменная k, определенная в main, переопределит k в пространстве имен blip.

Можно ли использовать директиву using более одного раза?

Пожалуйста, добавьте описание изображения

Guess you like

Origin blog.csdn.net/qq_42595610/article/details/131788359
C++
Recommended