Varsayılan olarak, ad boşluklu işlevleri kullanın.
Sınıflar, ad alanlarının yerine nesnelerin oluşturulması içindir.
Nesneye Dayalı kodda
Scott Meyers, Etkili C ++ kitabı için "Üye olmayan arkadaş olmayan işlevleri üye işlevlerine tercih et" başlıklı makalenin tamamını yazdı. Herb Sutter'ın bir makalesinde bu prensibe çevrimiçi bir referans buldum:http://www.gotw.ca/gotw/084.htm
Bilmeniz gereken önemli olan şudur: C ++ işlevlerinde bir sınıfla aynı ad alanındaki işlevler o sınıfın arabirimine aittir (çünkü ADL işlev çağrılarını çözerken bu işlevleri arayacaktır).
Ad boşluklu işlevler, "arkadaş" olarak bildirilmedikçe, sınıfın iç bileşenlerine erişemezken, statik yöntemlere sahiptir.
Bu, örneğin, sınıfınızı korurken, sınıfınızın iç kısımlarını değiştirmeniz gerektiğinde, statik olanlar da dahil olmak üzere tüm yöntemlerinde yan etkileri aramanız gerekeceği anlamına gelir.
Eklenti I
Sınıf arayüzüne kod ekleme.
C # 'da, sınıfa erişiminiz olmasa bile bir sınıfa yöntem ekleyebilirsiniz. Ancak C ++ ile bu mümkün değildir.
Ancak, yine de C ++ 'da, birisinin sizin için yazdığı bir sınıfa bile, ad boşluklu bir işlev ekleyebilirsiniz.
Diğer taraftan, kodunuzu tasarlarken bu önemlidir, çünkü işlevlerinizi bir ad alanına koyarak kullanıcılarınıza sınıfın arayüzünü artırma / tamamlama yetkisi vereceksiniz.
Dahili II
Önceki noktanın bir yan etkisi, birden çok başlıkta statik yöntemler bildirmek imkansızdır. Her yöntem aynı sınıfta bildirilmelidir.
Ad alanları için, aynı ad alanındaki işlevler birden çok başlıkta bildirilebilir (neredeyse standart takas işlevi bunun en iyi örneğidir).
Uzantı III
Bir ad alanının temel serinliği, bazı kodlarda, "using" anahtar sözcüğünü kullanırsanız, bundan bahsetmekten kaçınabilmenizdir:
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Ve hatta "kirliliği" bir sınıfla sınırlayabilirsiniz:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Bu "model", neredeyse standart takas deyiminin düzgün kullanımı için zorunludur.
Ve bu, sınıflardaki statik yöntemlerle yapmak imkansızdır.
Yani, C ++ ad alanlarının kendi semantikleri vardır.
Ancak, ad alanlarını kalıtıma benzer bir şekilde birleştirebileceğiniz için daha da ileri gider.
Örneğin, AAA işlevli bir ad alanı A, BBB işlevli bir ad alanı B varsa, bir ad alanı C bildirebilir ve anahtar kelimeyi kullanarak bu ad alanına AAA ve BBB getirebilirsiniz.
Sonuç
Ad alanları ad alanları içindir. Sınıflar sınıflar içindir.
C ++ her kavramın farklı olması için tasarlanmıştır ve farklı durumlarda farklı sorunlara bir çözüm olarak farklı şekilde kullanılır.
Ad alanlarına ihtiyacınız olduğunda sınıfları kullanmayın.
Ve sizin durumunuzda, ad alanlarına ihtiyacınız var.