Jawaban:
Alias namespace adalah cara mudah untuk merujuk ke nama namespace yang panjang dengan nama lain yang lebih pendek.
Sebagai contoh, katakan Anda ingin menggunakan vektor numerik dari Boost's uBLAS tanpa using namespace
arahan. Menyebut namespace lengkap setiap kali merepotkan:
boost::numeric::ublas::vector<double> v;
Sebagai gantinya, Anda dapat mendefinisikan alias untuk boost::numeric::ublas
- katakanlah kami ingin menyingkat ini menjadi hanya ublas
:
namespace ublas = boost::numeric::ublas;
ublas::vector<double> v;
Sederhananya, #define tidak akan berfungsi.
namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }
Kompilasi baik-baik saja. Memungkinkan Anda bekerja di sekitar tabrakan namespace / nama kelas.
namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }
Pada baris terakhir, "Hmm: Ups" adalah kesalahan kompilasi. Pra-prosesor mengubahnya menjadi Tidak :: Ups, tetapi Tidak sudah merupakan nama kelas.
Lebih lanjut tentang topik ini http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n
Ini semua tentang memilih alias untuk nama namespace looong, seperti:
namespace SHORT = NamespaceFirst::NameSpaceNested::Meow
Lalu nanti, Anda bisa mengetik
typedef SHORT::mytype
dari pada
typedef NamespaceFirst::NameSpaceNested::Meow::mytype
Sintaks ini hanya berfungsi untuk ruang nama, tidak bisa menyertakan kelas, tipe setelah namespace NAME =
Juga perhatikan bahwa alias namespace dan menggunakan arahan diselesaikan pada waktu kompilasi, bukan waktu berjalan. (Lebih khusus, mereka berdua alat yang digunakan untuk memberitahu kompilator ke mana lagi harus mencari ketika menyelesaikan nama, jika tidak dapat menemukan simbol tertentu dalam lingkup saat ini atau salah satu dari lingkup induknya.) Misalnya, tidak satu pun dari ini akan menyusun:
namespace A {
int foo;
namespace AA {
int bar;
} // namespace AA
namespace AB {
int bar;
} // namespace AB
} // namespace A
namespace B {
int foo;
namespace BA {
int bar;
} // namespace BA
namespace BB {
int bar;
} // namespace BB
} // namespace B
bool nsChooser1, nsChooser2;
// ...
// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;
// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
if (nsChooser2)
using namespace A::AA;
else
using namespace A::AB;
else
if (nsChooser2)
using namespace B::BA;
else
using namespace B::BB;
Sekarang, pikiran yang ingin tahu mungkin telah memperhatikan bahwa constexpr
variabel juga digunakan pada waktu kompilasi, dan bertanya-tanya apakah mereka dapat digunakan bersama dengan alias atau arahan. Setahu saya, mereka tidak bisa, meskipun saya mungkin salah tentang ini. Jika Anda perlu bekerja dengan variabel bernama identik dalam ruang nama yang berbeda, dan memilih di antara mereka secara dinamis, Anda harus menggunakan referensi atau petunjuk.
// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);
int* bar;
if (nsChooser1) {
if (nsChooser2) {
bar = &A::AA::bar;
} else {
bar = &A::AB::bar;
}
} else {
if (nsChooser2) {
bar = &B::BA::bar;
} else {
bar = &B::BB::bar;
}
}
Kegunaan di atas mungkin terbatas, tetapi harus melayani tujuan.
(Permintaan maaf saya untuk kesalahan ketik yang mungkin saya lewatkan di atas.)
Namespace digunakan untuk mencegah konflik nama.
Sebagai contoh:
namespace foo {
class bar {
//define it
};
}
namespace baz {
class bar {
// define it
};
}
Anda sekarang memiliki dua bilah nama kelas, yang sama sekali berbeda dan terpisah berkat namespace.
"Using namespace" yang Anda tampilkan adalah agar Anda tidak harus menentukan namespace untuk menggunakan kelas di dalam namespace itu. yaitu std :: string menjadi string.
sumber saya: https://www.quora.com/What-is-namespace-in-C++-1