Espacio de nombres espacio de nombres de conceptos básicos de C ++

Motivación del espacio de nombres

Muchas bibliotecas desarrolladas de forma independiente se utilizan en el desarrollo de proyectos a gran escala. Es muy probable que haya funciones o plantillas con el mismo nombre en diferentes bibliotecas. Por supuesto, se puede evitar aumentando la complejidad de los nombres, pero No es una buena idea, por lo que el espacio de nombres surge espontáneamente. Puede resolver los conflictos de nombres dividiendo el espacio de nombres global en ámbitos para evitar la contaminación del espacio de nombres .
Ejemplo sencillo:

El espacio de nombres se crea de la siguiente manera:

espacio de nombres nombre del espacio de nombres {
//miembros
}

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

Aunque los nombres de los miembros en los dos espacios de nombres son los mismos, los ámbitos de los diferentes espacios de nombres son diferentes, por lo que no habrá conflictos.

estándar::cin estándar::cout estándar::endl

Los principiantes en C++ deben estar familiarizados con las tres oraciones anteriores

Primero reconozca un operador: ::operador de dominio

::El significado del operador de dominio es: busque el nombre en el lado derecho del alcance indicado por el nombre en el lado izquierdo del operador de dominio, es decir,
use std::cinel nombre cin en el espacio de nombres std

std es un espacio de nombres que se puede usar con la palabra clave using

No agregamos cin cout endl etc. en el programa a voluntad std::, porque agregamos el siguiente código al comienzo del programa:

using namespace std;

Después de agregar este código, siempre que el nombre en el espacio de nombres estándar se pueda usar directamente, no es necesario agregar un prefijo especial. Pero de hecho, al principio todos seguimos elCada declaración de uso introduce un miembro del espacio de nombresEl principio viene, por ejemplo, usando la siguiente declaración en el programa:

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

Todos estamos declarados de acuerdo con la siguiente plantilla:

using namespace::name;
(Después de declarar la declaración anterior, puede usar el nombre en el espacio de nombres del espacio de nombres)

Ahora mismo:

using std::cout
using std::endl

Entonces puedes usar audazmente el siguiente código:

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

Pero:
using std::cout;
using std::endl;
Las dos declaraciones anteriores solo se pueden usar sin prefijo cuando se usa cout y endl, pero aún necesitan agregar el prefijo ( ) cuando se usa una cadena en std. std::stringSi lo usa using namespace std;, no lo necesita.string

De hecho, la forma del código anterior es la siguiente:

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

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

La diferencia entre usar espacio de nombres y usar

En C++, using namespacey usingson dos formas diferentes de usar espacios de nombres.

Término técnico:
using namespacellamado usando instrucción

usingllamado usando declaración

usando indica que todos los nombres en un espacio de nombres se inyectan a la vez

Una declaración de uso solo puede introducir variables miembro en un espacio de nombres a la vez


Por ejemplo:using namespace org::cyclonedds;

Esta es una forma de usar espacios de nombres para especificar el espacio de nombres usado en el ámbito actual. Al usar using namespace, podemos omitir el prefijo del espacio de nombres que debe agregarse al usar las clases, funciones y variables en el espacio de nombres para simplificar el código.
Para using namespace org::cyclonedds, org::cycloneddsintroduce todos los miembros en todo el espacio de nombres en el alcance actual, de modo que podamos usar directamente las clases, funciones y variables en el espacio de nombres sin agregar un prefijo al usarlo org::cyclonedds.

La lengua vernácula significa: de esta forma de declaración org::cyclonedds es un espacio de nombres

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

using org::cyclonedds

Esta es una forma de usar miembros específicos de un espacio de nombres, que especifica que los miembros específicos del espacio de nombres se usan en el ámbito actual. Al usar using,Podemos introducir selectivamente uno o algunos miembros del espacio de nombres en lugar del espacio de nombres completo.
Porque using org::cyclonedds, sólo introduce org命名空间中的一个成员cyclonedds,而不是整个命名空间. entonces,Solo podemos usar los miembros específicos importados directamente, otros miembros no introducidos aún necesitan agregar el prefijo de espacio de nombres correspondiente para usar


Para resumir, usar el espacio de nombres org::cyclonedds presenta a todos los miembros en todo el espacio de nombres org::cyclonedds, mientras que usar org::cyclonedds solo presenta miembros específicos en el espacio de nombres. Ambos pueden simplificar el código y permitirnos usar directamente los miembros en el espacio de nombres sin agregar el prefijo del espacio de nombres.

La diferencia entre la instrucción de uso y la declaración de uso se verifica con un ejemplo

#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;
}

Análisis:
1. cout << "num = " << num << endl; La variable global num se usa para llamadas directas, y el valor num en org::eclipse::duzhognbo::numel espacio de nombres se llama solo cuandoorg::eclipse::duzhognbo

2. using namespace org1::eclipse1::duzhognbo1Es para importar todos los miembros en el espacio de nombres, y no es necesario que ningún miembro tenga un prefijo, por ejemploname、num2

3. using org1::eclipse1::duzhognbo1::name;//Simplemente introduzca un nombre de miembro específico en el espacio de nombres, el nombre se puede usar directamente, num2 no puede

#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; es importar org1::eclipse1todos los miembros en este espacio de nombres, por lo que al acceder a name y num2, duzhognbo1::namey son obligatorios duzhognbo1::num2.

Resumir
1. Siempre que aparezca la palabra clave de espacio de nombres using, todos los miembros de un determinado espacio de nombres se importarán directamente.
2. Si solo hay uso, se agregarán miembros específicos.
3. Si no hay espacio de nombres using o using, use org1: :eclipse1 directamente en el programa: La forma de :duzhognbo1::name indica que se accede directamente a los miembros en el espacio de nombres, y no se introducen miembros específicos o todos los miembros.

Ejemplos de uso común del espacio de nombres

1. Uso básico:

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

2. Espacio de nombres anidado (tenga en cuenta el método de acceso)

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

3. Usa un alias

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

namespace ns = MyNamespace; Puede dar a un espacio de nombres complejo un nombre conciso ns

Por supuesto, también puede alias espacios de nombres anidados

espacio de nombres MyNamespace { espacio de nombres MyNamespace222 {

}}
namespace ns = MyNamespace::MyNamespace222;

4. Expansión del espacio de nombres

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

Aviso:

espacio de nombres nombre del espacio de nombres { // miembros }

Declaraciones que crean un nuevo espacio de nombres o agregan nuevos miembros a un espacio de nombres existente

El uso indica una solución a los conflictos entre los miembros del espacio de nombres y otras variables

Por favor agregue una descripción de la imagen

Todos los miembros en el espacio de nombres bilp son using namespace blipinyectados por el código de instrucción de uso ( ).En este momento, la j en el espacio se repite con la variable global j, que se distingue por ::jrepresentar la variable global y representar la j en el espacio de nombres.blip::j

Una variable local k definida en main anulará k en el espacio de nombres blip

¿Se puede usar la directiva de uso más de una vez?

Por favor agregue una descripción de la imagen

Supongo que te gusta

Origin blog.csdn.net/qq_42595610/article/details/131788359
Recomendado
Clasificación