O namespace em C ++ é usado para organizar o código em grupos lógicos e para evitar colisões de nomes que podem ocorrer especialmente quando sua base de código inclui várias bibliotecas. Neste artigo, os seguintes indicadores serão abordados:
- A necessidade de namespace
- Definindo um namespace em C ++
- Pontos a serem lembrados ao definir um namespace
- Usando namespace em C ++
- Namespaces descontíguos
- Namespaces aninhados
A necessidade de namespace
Considere uma situação, estamos escrevendo algum código que tem uma função chamada abc () e há outra biblioteca predefinida disponível que também tem a mesma função abc (). Agora, no momento da compilação, o compilador não tem ideia de qual versão da função abc () estamos nos referindo em nosso código.
Para superar essa dificuldade, o namespace é projetado e usado como informação adicional para diferenciar funções, variáveis, classes, etc. semelhantes com o mesmo nome disponíveis em diferentes bibliotecas. Usando o namespace, podemos definir o contexto no qual os nomes são definidos. Em essência, um namespace define um escopo.
Todos os tipos e funções de biblioteca padrão C ++ são declarados no namespace std ou namespaces aninhados dentro de std, portanto, são amplamente usados na maioria dos programas.
Definindo um Namespace
Para definir o namespace, começamos com a palavra-chave namespace seguido pelo nome do namespace da seguinte maneira:
namespace namespace_name {int a, b // declarações de código onde // aeb são declarados no // escopo do namespace_name}
Pontos a serem lembrados ao definir um namespace
- As declarações de namespace aparecem apenas no escopo global.
- As declarações de namespace não têm especificadores de acesso.
- As declarações de namespace podem ser aninhadas em outro namespace.
- Não há necessidade de colocar ponto e vírgula após a chave de fechamento da definição do namespace.
- A definição do namespace pode ser dividida em várias unidades.
#include usando namespace std namespace first_function {void func () {cout<< 'Inside first_function' << endl } } namespace second_function { void func() { cout << 'Inside second_function' << endl } } int main () { // Calls function from first name space. first_function::func() // Calls function from second name space. second_function::func() return 0 }
Resultado:
No exemplo acima, para definir a função func () em dois momentos diferentes, usamos o conceito de namespace. Definimos a primeira função no namespace first_function esegunda função no namespace second_function. Para chamar essas funções, usamos o operador de resolução de escopo da seguinte maneira - first_function :: func () e second_function :: func ().
Usando namespace em C ++
Existem três maneiras de usar um namespace no programa,
- A diretiva using
- A declaração de uso
- Operador de resolução de escopo (: :)
A diretiva using
Podemos evitar prefixar namespaces com o usando diretiva de namespace. usando palavra-chave nos permite importar um namespace inteiro em seu programa com um escopo global. Ele pode ser usado para importar um namespace para outro namespace ou qualquer programa de acordo com nossos requisitos.
uso de charat em java
Considere um arquivo de cabeçalho Namespace_first.h:
namespace First {int a class First_class {int i}}
Incluindo o arquivo de cabeçalho de namespace acima no arquivo Namespace_second.h: inclua “Namespace_first.h”
c ++ usar namespace
namespace Second {using namespace First_class obj int y}
Importamos o namespace_First para o namespace_Second, portanto, a classe First_class agora estará disponível no namespace_Second. Portanto, podemos escrever o seguinte programa em um arquivo separado, digamos new_file.cpp.
#include 'Namespace_second.h' void test () {usando namespace Segundo // criando objeto da classe First_class First_class obj2}
Conseqüentemente , a diretiva using torna muito mais fácil usar um namespace em C ++, onde você quiser.
A declaração de uso
Na declaração de uso, importamos um nome específico por vez, que está disponível apenas dentro do escopo atual e é chamado com a ajuda da resolução de escopo. NOTA: O nome importado com a declaração de uso pode substituir o nome importado com a diretiva de uso. Podemos ver isso no exemplo abaixo.
Vamos considerar um arquivo de cabeçalho New_File.h:
namespace Primeiro {void A () {cout<< 'A of First namespacen' } } namespace Second { void A() { cout << 'A of Second namespacen' } }
Agora vamos criar um novo arquivo de programa com o nome New_file_2.cpp com o código abaixo:
#include 'New_file.h' void B () {usando o namespace Primeiro // usando a diretiva usando Second :: A // usando a declaração First :: A () // classe A () do primeiro namespace A () // chama A () do segundo namespace}
Operador de resolução de escopo (: :)
Podemos especificar explicitamente qualquer nome declarado em um namespace usando o nome do namespace e a resolução do escopo “ :: ' operador com o identificador.
namespace New_space {class X {static int i public: void func ()} // declaração do nome da classe class Y} // Inicializando a variável de classe estática int New_space :: X :: i = 23 class New_space :: Y {int a public: int getdata () {cout<< a } // Constructor declaration Y() } // Constructor definition explicitly New_space::Y::Y() { a=0 }
Namespace descontíguo em C ++
Como sabemos, um namespace em C ++ pode ser definido em várias partes, portanto, é composto da soma de suas partes definidas separadamente. Portanto, se uma parte do namespace requer um nome definido em outro arquivo, esse nome ainda deve ser declarado em seu escopo. Escrever o seguinte namespace da maneira a seguir define um novo namespace ou adiciona novos elementos a um existente:
namespace namespace_name {// corpo do código}
Namespace aninhado em C ++
Os namespaces podem ser aninhados facilmente e podemos definir um namespace dentro de outro namespace da seguinte maneira:
namespace namespace_name1 {// corpo do código do namespace_name1 namespace namespace_name2 {// corpo do código aninhado namamespace_name2}}
Com isso, chegamos ao fim do artigo Namespace in C ++. Espero que você tenha uma ideia do que exatamente é um namespace em C ++ e quais são as diferentes maneiras de defini-lo. Se você deseja saber mais, confira o pela Edureka, uma empresa de aprendizagem online confiável. O curso de certificação e treinamento em Java J2EE e SOA da Edureka foi projetado para treiná-lo tanto para conceitos básicos quanto avançados de Java, juntamente com várias estruturas Java como Hibernate e Spring.
Tem alguma questão para nós? Mencione isso na seção de comentários deste blog e entraremos em contato com você o mais breve possível.