Giriş
Temel C++ programlamasında veri türü, e.g., int veya char, bir bildirimde veya tanımda belirtilmelidir. 4 veya 22 veya -5 gibi bir değer bir int'dir. 'A' veya 'b' veya 'c' gibi bir değer bir karakterdir. Şablon mekanizması, programcının bir dizi gerçek tür için genel bir tür kullanmasına izin verir. Örneğin, programcı int veya char için T tanımlayıcısını kullanmaya karar verebilir. Bir C++ algoritmasının birden fazla genel türe sahip olması mümkündür. Örneğin, int veya char için T ile, U kayan nokta veya işaretçi tipini temsil edebilir. Dize veya vektör sınıfı gibi bir sınıf, bir veri türü gibidir ve somutlaştırılan nesneler, belirtilen sınıf olan veri türünün değerleri gibidir. Böylece şablon mekanizması, programcının bir dizi sınıf için genel bir tür tanımlayıcısı kullanmasına da izin verir.
Bir C++ şablonu, kullanılan veri türünden bağımsız bir algoritma oluşturur. Bu nedenle, aynı türden birçok oluşumu olan aynı algoritma, farklı yürütmelerde farklı türleri kullanabilir. Değişken, işlev, yapı ve sınıf varlıklarının şablonları olabilir. Bu makale, şablonların nasıl bildirileceğini, şablonların nasıl tanımlanacağını ve bunların C'de nasıl uygulanacağını açıklar++. Bu makalede ele alınan konuları anlamak için yukarıda belirtilen varlıklar hakkında zaten bilgi sahibi olmalısınız.
Türler
skaler
Skaler tipler void, bool, char, int, float ve pointer'dır.
Tür Olarak Sınıflar
Belirli bir sınıf, bir tür olarak ve nesneleri olası değerler olarak kabul edilebilir.
Genel bir tür, bir dizi skaler türü temsil eder. Skaler türlerin listesi kapsamlıdır. Örneğin int türü, kısa int, uzun int vb. gibi diğer ilgili türlere sahiptir. Genel bir tür, bir sınıf kümesini de temsil edebilir.
Değişken
Bir şablon bildirimi ve tanımı örneği aşağıdaki gibidir:
şablonTpi = 3.14;
Devam etmeden önce, bu tür bir ifadenin main() işlevinde veya herhangi bir blok kapsamında görüntülenemeyeceğini unutmayın. İlk satır, programcı tarafından seçilen genel tür adı T ile şablon başlığı bildirimidir. Bir sonraki satır, T genel türünde olan pi tanımlayıcısının tanımıdır. T'nin bir int veya bir kayan nokta veya başka bir tür olup olmadığına dair kesinlik, C++ main() işlevinde (veya başka bir işlevde) yapılabilir. Böyle bir kesinlik T ile değil pi değişkeni ile yapılacaktır.
İlk satır, şablon başlığı bildirimidir. Bu bildirim, ayrılmış sözcük, şablon ve ardından açık ve kapalı açılı ayraçlarla başlar. Köşeli parantezler içinde, yukarıda T gibi en az bir genel tip tanımlayıcı vardır. Her birinin önünde ayrılmış bir sözcük olan typename ile birlikte birden fazla genel tür tanımlayıcısı olabilir. Bu konumdaki bu tür genel türlere şablon parametreleri denir.
Aşağıdaki ifade main() veya başka bir fonksiyonda yazılabilir:
cout << piVe fonksiyon 3 gösterecektir.14. pi ifadesi
Uzmanlıkta, kayan nokta gibi seçilen veri türü, değişkenden sonra köşeli parantez içine yerleştirilir. Şablon başlığı bildiriminde birden fazla şablon parametresi varsa, uzmanlık ifadesinde aynı sırada karşılık gelen sayıda veri türü olacaktır.
Uzmanlıkta, bir tür şablon argümanı olarak bilinir. Bu ve işlev çağrısı için işlev argümanı arasında karıştırmayın.
Varsayılan Tür
Uzmanlıkta hiçbir tür verilmezse, varsayılan tür varsayılır. Yani, aşağıdaki ifadeden:
şablonU pi = "aşk";
ekrandan:
cout << pi<> << '\n';
char için sabit işaretçi için "aşk" dır. Bildirimde U = const char* olduğuna dikkat edin. Köşeli parantezler uzmanlıkta boş olacaktır (tür belirtilmemiş); gerçek tür, varsayılan tür olan char için bir const işaretçisi olarak kabul edilir. Uzmanlıkta başka bir türe ihtiyaç duyulursa, tür adı köşeli parantez içinde yazılırdı. Uzmanlıkta varsayılan tip istendiğinde, köşeli parantez içindeki tipin tekrarlanması isteğe bağlıdır, i.e., köşeli parantezler boş bırakılabilir.
Not: Varsayılan tür, uzmanlıkta farklı bir türe sahip olarak değiştirilebilir.
yapı
Aşağıdaki örnek, bir şablon parametresinin bir yapı ile nasıl kullanılabileceğini gösterir:
şablonT John = 11;
T Peter = 12;
T Mary = 13;
T Sevinç = 14;
;
Bunlar, bir sınıftaki (sınıftaki) öğrencilerin yaşlarıdır. İlk satır şablon bildirimidir. Parantez içindeki gövde, şablonun gerçek tanımıdır. Yaşlar, main() işlevinde aşağıdakilerle çıktılanabilir:
Yaşlarcout << grade7.John << " << grade7.Mary << '\n';
Çıktı: 11 13. Buradaki ilk ifade uzmanlaşmayı gerçekleştirir. Nasıl yapıldığına dikkat edin. Ayrıca yapının bir nesnesi için bir isim verir: grade7. İkinci ifadede sıradan struct nesne ifadeleri var. Bir yapı bir sınıf gibidir. Burada Ages bir sınıf adı gibidir, grade7 ise sınıfın bir nesnesidir (struct).
Bazı yaşlar tamsayı ve diğerleri yüzer ise, yapı aşağıdaki gibi iki genel parametreye ihtiyaç duyar:
şablonT John = 11;
U Peter = 12.3;
T Mary = 13;
U Sevinç = 14.6;
;
main() işlevi için ilgili bir kod aşağıdaki gibidir:
Yaşlarcout << grade7.John << " << grade7.Peter << '\n';
Çıktı: 11 12.3. Uzmanlıkta, türlerin (argümanların) sırası, bildirimdeki genel türlerin sırasına karşılık gelmelidir.
Şablon bildirimi, tanımdan aşağıdaki gibi ayrılabilir:
şablonJohn;
u Peter;
Meryem;
Ü Sevinç;
;
Yaşlar
İlk kod segmenti tamamen bir şablonun bildirimidir (atama yoktur). Yalnızca bir ifade olan ikinci kod bölümü, sınıf7 tanımlayıcısının tanımıdır. Sol taraf tanımlayıcının bildirimidir, grade7. Sağ taraf, yapı üyelerine karşılık gelen değerleri atayan başlatıcı listesidir. İkinci bölüm (ifade) main() işlevinde yazılabilirken, ilk bölüm main() işlevinin dışında kalır.
Tip dışı
Veri olmayan türlere örnek olarak int, işaretçiden nesneye, işaretçiden işleve ve otomatik türler verilebilir. Bu makalenin ele almadığı başka tür olmayanlar da var. Tip olmayan, değeri daha sonra verilen ve değiştirilemeyen tamamlanmamış bir tür gibidir. Parametre olarak, belirli bir tür olmayanla başlar ve ardından bir tanımlayıcı gelir. Tanımlayıcının değeri daha sonra, uzmanlıkta verilir ve bir daha değiştirilemez (değeri daha sonra verilen bir sabit gibi). Aşağıdaki program bunu göstermektedir:
#Dahil etmekad alanı std kullanarak;
şablon
T John = N;
U Peter = 12.3;
T Mary = N;
U Sevinç = 14.6;
;
int ana()
Yaşlar
cout << grade7.John << " << grade7.Joy << '\n';
0 döndür;
Uzmanlıkta, köşeli parantez içindeki ilk tür olan int, parametre sayısının ve sırasının türlerin (argümanların) sayısına ve sırasına karşılık geldiğinden emin olmak için formalite için daha fazladır. N'nin değeri uzmanlıkta verilmiştir. Çıktı: 11 14.6.
Kısmi Uzmanlaşma
Bir şablonun dört genel türü olduğunu ve dört tür arasında iki varsayılan türe ihtiyaç olduğunu varsayalım. Bu, atama operatörünü kullanmayan kısmi uzmanlaşma yapısı kullanılarak gerçekleştirilebilir. Bu nedenle, kısmi uzmanlaşma yapısı, genel türlerin bir alt kümesine varsayılan değerler verir. Ancak, kısmi uzmanlaşma şemasında, bir temel sınıf (yapı) ve bir kısmi uzmanlık sınıfı (yapı) gereklidir. Aşağıdaki program, bunu iki genel türden bir genel tür için gösterir:
#Dahil etmekad alanı std kullanarak;
//temel şablon sınıfı
şablon
yapı yaşları
;
//kısmi uzmanlaşma
şablon
yapı yaşları
T1 John = 11;
yüzer Peter = 12.3;
T1 Meryem = 13;
şamandıra Joy = 14.6;
;
int ana()
Yaşlar
cout << grade7.John << " << grade7.Joy << '\n';
0 döndür;
Temel sınıf bildirimini ve kısmi sınıf tanımını tanımlayın. Temel sınıfın şablon başlığı bildirimi, gerekli tüm genel parametrelere sahiptir. Kısmi uzmanlık sınıfının şablon başlığı bildirimi yalnızca genel türe sahiptir. Kısmi uzmanlaşma tanımında sınıf adından hemen sonra gelen şemada kullanılan fazladan bir köşeli ayraç seti vardır. Kısmi uzmanlaşmanın gerçekte yaptığı şey budur. Temel sınıfta yazılan sırayla, varsayılan türe ve varsayılan olmayan türe sahiptir. Ana () işlevinde varsayılan türe hala farklı bir tür verilebileceğini unutmayın.
main() işlevindeki ilgili kod aşağıdaki gibi olabilir:
Yaşlarcout << grade7.John << " << grade7.Joy << '\n';
Çıktı: 11 14.6.
Şablon Parametre Paketi
Parametre paketi, karşılık gelen veri türleri için sıfır veya daha fazla şablon genel türünü kabul eden bir şablon parametresidir. Parametre paketi parametresi, ayrılmış kelime typename veya class ile başlar. Bunu üç nokta takip eder ve ardından paketin tanımlayıcısı. Aşağıdaki program, bir şablon parametre paketinin bir yapı ile nasıl kullanılabileceğini gösterir:
#Dahil etmekad alanı std kullanarak;
şablon
int John = 11;
yüzer Peter = 12.3;
int Meryem = 13;
şamandıra Joy = 14.6;
;
int ana()
Yaşlar
cout << gradeB.John << " << gradeB.Mary << '\n';
Yaşlar
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Yaşlar
cout << gradeD.John << " << gradeD.Joy << '\n';
Yaş<> dereceA; //varsayılan gibi
cout << gradeA.John << " << gradeA.Joy << '\n';
0 döndür;
Çıktı:
11 1312.3 14.6
11 14.6
11 14.6
Fonksiyon Şablonları
Yukarıda belirtilen şablon özellikleri, işlev şablonlarına benzer şekilde uygulanır. Aşağıdaki program, iki genel şablon parametresi ve üç bağımsız değişken içeren bir işlevi gösterir:
#Dahil etmekad alanı std kullanarak;
şablon
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int ana()
func(12, '$', "500");
0 döndür;
Çıktı aşağıdaki gibidir:
Mağazada 500 dolar değerinde 12 kitap var.
Prototipten Ayrılma
Aşağıdaki programda gösterildiği gibi, fonksiyon tanımı prototipinden ayrılabilir:
#Dahil etmekad alanı std kullanarak;
şablon
şablon
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int ana()
func(12, '$', "500");
0 döndür;
Not: İşlev şablonu bildirimi, main() işlevinde veya başka herhangi bir işlevde görünemez.
Aşırı yükleme
Aynı işlevin aşırı yüklenmesi, farklı şablon başlığı bildirimleriyle gerçekleşebilir. Aşağıdaki program bunu göstermektedir:
#Dahil etmekad alanı std kullanarak;
şablon
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
şablon
cout << "There are " << no << " books worth $" << str << " in the store." << '\n';
int ana()
func(12, '$', "500");
işlev(12, "500");
0 döndür;
Çıktı:
Mağazada 500 dolar değerinde 12 kitap var.
Mağazada 500 dolar değerinde 12 kitap var.
Sınıf Şablonları
Yukarıda bahsedilen şablonların özellikleri, sınıf şablonlarına benzer şekilde uygulanır. Aşağıdaki program, basit bir sınıfın bildirimi, tanımı ve kullanımıdır:
#Dahil etmekad alanı std kullanarak;
sınıf TheCla
halka açık:
int sayı;
statik karakter ch;
void func (char cha, const char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statik boşluk eğlencesi (char ch)
if (ch == 'a')
cout << "Official static member function" << '\n';
;
int ana()
TheCla nesnesi;
nesne.sayı = 12;
nesne.func('$', "500");
0 döndür;
Çıktı aşağıdaki gibidir:
Mağazada 500 dolar değerinde 12 kitap var.
Aşağıdaki program, şablon başı bildirimi olan yukarıdaki programdır:
#Dahil etmekad alanı std kullanarak;
şablon
halka açık:
T sayısı;
statik U ch;
void func (U cha, const char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statik boşluk eğlencesi (U ch)
if (ch == 'a')
cout << "Official static member function" << '\n';
;
int ana()
TheCla
nesne.sayı = 12;
nesne.func('$', "500");
0 döndür;
Şablon parametre listesindeki typename kelimesi yerine, word sınıfı kullanılabilir. Nesnenin beyanındaki uzmanlığa dikkat edin. Çıktı hala aynı:
Mağazada 500 dolar değerinde 12 kitap var.
Ayırma Beyannamesi
Sınıf şablonu bildirimi, sınıf kodundan aşağıdaki gibi ayrılabilir:
şablonşablon
halka açık:
T sayısı;
statik U ch;
void func (U cha, const char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statik boşluk eğlencesi (U ch)
if (ch == 'a')
cout << "Official static member function" << '\n';
;
Statik Üyelerle Başa Çıkma
Aşağıdaki program, bir statik veri üyesine ve bir statik üye işlevine nasıl erişileceğini gösterir:
#Dahil etmekad alanı std kullanarak;
şablon
halka açık:
T sayısı;
statik U ch;
void func (U cha, const char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statik boşluk eğlencesi (U cha)
if (ch == 'a')
cout << "Official static member function" << cha << '\n';
;
şablon
int ana()
TheCla
0 döndür;
Statik bir veri üyesine değer atamak bir bildirimdir ve main() içinde olamaz. Atama bildiriminde genel türlerin ve genel veri türünün kullanımını ve konumlarını not edin. Ayrıca, asıl şablon veri türleri ile main() içinde statik veri üyesi işlevinin çağrıldığını unutmayın. Çıktı aşağıdaki gibidir:
Resmi statik üye işlevi.
derleme
Beyan (başlık) ve bir şablonun tanımı tek bir dosyada olmalıdır. Yani, aynı çeviri biriminde olmaları gerekir.
Sonuç
C++ şablonları, kullanılan veri türünden bağımsız bir algoritma yapar. Değişken, işlev, yapı ve sınıf varlıkları, bildirim ve tanımlamayı içeren şablonlara sahip olabilir. Bir şablon oluşturmak ayrıca, genel bir türün gerçek bir tür aldığı uzmanlaşmayı da içerir. Bir şablonun beyanı ve tanımının her ikisi de tek bir çeviri biriminde olmalıdır.