C++ Namespace

Namespace di C++ adalah lingkup umum. Deklarasinya dimulai dengan kata yang dicadangkan, namespace, diikuti dengan nama pilihan programmer, dan kemudian blok dalam kurung kurawal. Blok berisi deklarasi dasar dan/atau definisi objek C++, fungsi, dan entitas lainnya.

Perhatikan dua pernyataan skalar berikut dalam lingkup global, dalam program berikut:

#include <iostream>
using namespace std;

int varId = 5;
float varId = 2.3;

int main()
{

    return 0;
}

Upaya untuk mengkompilasi program ini menyebabkan error kompilasi. Ada dua variabel dengan nama yang sama,varId. Meskipun mereka adalah dua variabel yang berbeda dari dua jenis yang berbeda,int dan float, kompiler menolak dua deklarasi karena mereka memiliki nama yang sama. Program berikut memecahkan masalah ini dengan mendeklarasikan variabel dengan nama yang sama dalam dua lingkup umum yang berbeda:

#include <iostream> 
using namespace std;

namespace NA
    {
        int varId = 5;
    }

namespace NB
    {
        float varId = 2.3;
    }

int main()
{
    cout << NA::varId << 'n';
    cout << NB::varId << 'n';

    return 0;
}

Outputnya adalah sebagai berikut:

5
2.3

Ada dua ruang nama dalam program di atas: NA, yang memiliki definisi bilangan bulat, dan NB, yang memiliki definisi float tetapi dengan nama yang sama dengan bilangan bulat untuk NA. Akhirnya, ketika program dijalankan, nama yang sama untuk dua variabel yang berbeda digunakan. Perhatikan bahwa untuk mengakses nama yang sama dari dua variabel yang berbeda, nama khusus untuk namespace harus digunakan, diikuti oleh pengenal umum. Nama namespace dan pengenal umum dipisahkan oleh operator resolusi lingkup, “::.” Nama ruang nama akan membedakan objek.

Artikel ini membahas konsep dasar namespace dan userannya dalam bahasa pemrograman C++. Untuk mengikuti artikel ini, Anda harus memiliki pengetahuan dasar tentang bahasa C++. Anda juga harus memiliki pengetahuan tentang ruang lingkup C++, meskipun dijelaskan secara singkat dalam artikel ini. Untuk mempelajari lebih lanjut tentang cakupan C++, cari frasa, “Cakupan dalam C++” (tanpa tanda kutip) di kotak pencarian di halaman web linuxhint.com dan tekan Enter. Ini akan mengarahkan Anda ke artikel yang ditulis oleh penulis ini.

Isi Artikel

Apa itu Namespace?

Wilayah deklaratif adalah bagian terbesar dari program di mana nama entitas (variabel) valid. Wilayah ini disebut ruang lingkup. Namespace di C++ adalah lingkup umum yang tujuan utamanya adalah untuk menyelesaikan konflik nama. Namespace memiliki deklarasi dasar dan/atau definisi entitas.

Namespace Global dan Masalahnya

Namespace global adalah lingkup global. Perhatikan program singkat berikut:

#include <iostream>
using namespace std;

int ident = 55;
float ident = 12.17;

int main()
{

    return 0;
}

Dalam program di atas, ada dua variabel, keduanya disebut ident. Variabel-variabel ini berada dalam lingkup global; yaitu, mereka berada di namespace global. Upaya untuk mengkompilasi program ini akan gagal dengan pesan error. Lingkup global tidak menerima lebih dari satu variabel dengan nama yang sama, jadi ada kebutuhan untuk ruang nama khusus.

Ruang Nama Kustom

Namespace tidak hanya memiliki satu nama. Sebagai gantinya, namespace memiliki sekumpulan nama untuk menghindari konflik dengan kumpulan nama lainnya. Untuk menghindari konflik di bagian bawah kode, awali setiap nama dengan nama namespace dan::. Program berikut
mengilustrasikan ini menggunakan dua ruang nama khusus:

#include <iostream>
using namespace std;

namespace NA
    {
        int varInt = 6;
        float flt;
    }

namespace NB
    {
        int varInt = 7;
        float flt;
    }

int main()
{
    cout << NA::varInt << 'n';
    cout << NB::varInt << 'n';
    NA::flt = 2.5;
    NB::flt = 4.8;
    cout << NA::flt << 'n';
    cout << NB::flt << 'n';

    return 0;
}

Outputnya adalah:

6
7
2.5
4.8

Perhatikan bahwa nama-nama NA::flt dan NB::flt akhirnya telah didefinisikan dalam main()fungsi. C++ tidak mengizinkan definisi seperti itu dalam lingkup global.

Perhatikan bahwa namespace kustom adalah namespace bersarang untuk namespace global.

Petunjuk useran

Untuk menghindari mengetik “namepace::name” sepanjang waktu alih-alih hanya “name” setelah mendeklarasikan namespace, Anda dapat menggunakan usingpengarahan. Sintaks untuk menggunakanusing arahannya sebagai berikut:

using namespace Namespace_name;

Itu using direktif bukan direktif preprocessor, jadi diakhiri dengan titik koma (;).

Program berikut mengilustrasikan useran using direktif dan lainnya:

#include <iostream>
using namespace std;

namespace NB
    {
        int varInt = 7;
        int func ()
            {
                return varInt;
            }
    }

int fn()
    {
        using namespace NB;
        int myVar2 =  func();
        //other objects and functions from NB follow.
        return myVar2;
    }

int myVar3 = NB::func();

int main()
{
    cout << fn() << ' ' << myVar3 << 'n';

    return 0;
}

Keluaran dari program ini adalah 7 7. Syarat “using namespace NB;” telah ditempatkan di awal fn()definisi. Itufunc() dari namespace NB disebut tepat di bawahnya, tanpa diawali dengan “NB::.”

Variabel yang dideklarasikan dalam lingkup global (global namespace) dilihat dari titik deklarasi hingga akhir file. Itu juga terlihat di ruang nama bersarang (cakupan bersarang), seperti ruang bersarangfn()lingkup fungsi di atas. Ituusing direktif bergabung dengan namespace dari posisi di mana ia ditempatkan ke akhir lingkup di mana ia ditempatkan.

Nama func() dari namespace NB tidak dapat dilihat di bawah fn() definisi karena “using namespace NB;” ditempatkan dalam lingkup fungsi (blok). Dalam kondisi ini, untuk menggunakan “func()” di luar blok namespace NB (lingkup), harus didahului dengan “NB::” seperti pada pernyataan berikut:

int myVar3 = NB::func();

Itu usingdirektif menggabungkan namespace dengan namespace bersarang luar dari posisi di mana ia ditempatkan ke ujung namespace bersarang luar. Dalam program berikut, namespace NA digabungkan dengan namespace global. Kedua ruang nama kemudian diperluas kefn()namespace definisi fungsi, di mana mereka bergabung dengan namespace NB. Namespace NB berakhir di akhirfn() definisi fungsi, dan dua ruang nama sebelumnya berlanjut hingga akhir file (baca kodenya).

#include <iostream>
using namespace std;

namespace NA
    {
        int varInt = 6;
        int func ()
            {
                return varInt;
            }
       
    }

namespace NB
    {
        int varInt = 7;
        int func ()
            {
                return varInt;
            }
    }

using namespace NA;
int myVar0 = varInt;
//other objects and functions from :: and NB follow.

int fn()
    {
        int myVar1 = varInt;
        using namespace NB;
        int myVar2 =  NB::func();
        //other objects and functions from NB follow, till end of this scope.
        return myVar1 + myVar2;
    }

//Only objects and functions from :: and NB follow.

int myVar3 = NB::func();

int main()
{
    cout << myVar0 << ' ' << fn() << ' ' << myVar3 << 'n';

    return 0;
}

Keluarannya adalah 6, 13, 7.

Catatan: Namespace global ditunjukkan dengan::, artinya tidak ada apa pun sebelum operator resolusi ruang lingkup yang mengikuti.

Di bawah pernyataan, “using namespace NA;” variabel dari ruang nama global dan NA dapat digunakan tanpa indikasi ruang nama sumbernya. Pernyataan selanjutnya menggunakanvarInt dari ruang nama NA. Wilayah namespace gabungan global dan NA meluas kefn()ruang nama fungsi. SehinggavarInt dari pernyataan pertama dalam fn() lingkup fungsi, adalah dari namespace NA.

Karena wilayah untuk ruang nama global dan NA meluas ke seluruh fn() lingkup, setelah “int myVar2 = NB::func();,” nama apa pun dari namespace NB hanya dapat digunakan di fn() lingkup tanpa mendahuluinya dengan “NB::,” hanya jika itu tidak terjadi di NA dan ruang nama global (blok). Jika tidak, harus didahului dengan “NB::.” Wilayah ruang nama gabungan untuk NA dan global berlanjut di bawahfn() definisi dan ke dalam main() berfungsi sampai akhir file.

Perpanjangan namespace NB dimulai dari “int myVar2 = NB::func();” dalam fn() blok dan berakhir di ujung fn() blok definisi.

Catatan: Namespace yang regionnya digabungkan tidak boleh memiliki nama variabel yang sama di blok namespace yang berbeda, karena ini masih akan menyebabkan konflik.

Wilayah Namespace

Namespace adalah ruang lingkup. Terlepas dari namespace global (global scope), namespace apa pun harus dideklarasikan dalam sebuah blok. Blok itu adalah bagian pertama dari kemungkinan wilayah terdistribusi dari namespace. Dengan menggunakan direktif, namespace dapat diperluas sebagai wilayah dalam lingkup lain.

Entitas yang dideklarasikan dalam badan namespace dikatakan sebagai anggota namespace, dan nama yang diperkenalkan oleh deklarasi ini ke dalam wilayah deklaratif namespace dikatakan sebagai nama anggota namespace.

Ruang Nama Bersarang

Program berikut menunjukkan ruang nama bersarang:

#include <iostream> 
using namespace std;

namespace A
    {
        int i = 1;
        namespace B
            {
                int i = 2;
                namespace C
                    {
                        int i = 3;
                    }
            }
    }

int main()
{
    cout << A::i << ' ' << A::B::i << ' ' <<  A::B::C::i << 'n';

    return 0;
}

Outputnya adalah:

1 2 3

Perhatikan bahwa tiga nilai telah diakses menggunakan operator resolusi lingkup.

Ruang Nama Standar

C++ memiliki perpustakaan yang disebut perpustakaan standar. Nama-nama objek, fungsi, dan entitas lain di perpustakaan ini berasal dari ruang nama yang disebut ruang nama standar, ditulis sebagaistd. Perpustakaan standar berisi sub-perpustakaan, dan salah satu dari sub-perpustakaan ini adalahiostream. Ituiostream perpustakaan berisi objek cout, yang digunakan untuk mengirim hasil ke konsol (terminal).

Nama cout harus di stdruang nama. Menggunakaniostream dengan nya std namespace, programnya harus sebagai berikut:

#include <iostream>
using namespace std;

Perhatikan useran using direktif dan std. Syarat “#include <iostream>” adalah direktif preprocessor dan tidak diakhiri dengan titik koma. Ini termasuk “file” iostream pada posisi arahannya.

Kesimpulan

Namespace adalah ruang lingkup. Deskripsi namespace (definisi) berisi deklarasi dasar dan/atau definisi objek C++, fungsi, dan entitas lainnya. Di luar definisi namespace, nama tersebut dapat diakses dengan sintaks, “namespaceName::name.” Terlepas dari namespace global (global scope), namespace apa pun harus dideklarasikan dalam sebuah blok. Blok itu adalah bagian pertama dari kemungkinan wilayah terdistribusi dari namespace. Denganusingdirektif, namespace dapat diperluas sebagai wilayah dalam cakupan lain. Namespace yang regionnya digabungkan tidak boleh memiliki nama variabel yang sama di blok namespace yang berbeda, karena ini masih akan menyebabkan konflik nama.

Chrys

Related Posts