C++

C++ Şablonları Nasıl Kullanılır

C++ Şablonları Nasıl Kullanılır

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:

şablon
Tpi = 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 << pi << '\n';

Ve fonksiyon 3 gösterecektir.14. pi ifadesi pi değişkeni için tam T tipine karar verir. Uzmanlaşma, şablon parametresi için belirli veri türüne karar verir. Örnekleme, bu durumda kayan nokta gibi belirli bir türü oluşturmaya yönelik C++ dahili işlemidir. Bir şablon parametresinin somutlaştırılması ile bir sınıfın somutlaştırılması arasında karıştırmayın. Şablon konusunda, birçok veri türünün tek bir genel tür adı olabilirken, birçok sınıfın tek bir genel sınıf adı olabilir. Bununla birlikte, sınıflar için genel sınıf adı, bir sınıf adı olarak değil, yalnızca bir sınıf olarak adlandırılır. Ayrıca, örneklenmiş bir nesne String sınıfı gibi bir sınıfa olduğu gibi, bir değer de int gibi bir veri türüne aittir.

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:

şablon
U 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:

şablon yapı yaşları

T 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şlar 7.sınıf;
cout << 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:

şablon yapı yaşları

T 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şlar 7.sınıf;
cout << 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:

şablon yapı yaşları

John;
u Peter;
Meryem;
Ü Sevinç;
;
Yaşlar 7. derece = 11, 12.3, 13, 14.6;

İ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 etmek
ad alanı std kullanarak;
şablon yapı yaşları

T John = N;
U Peter = 12.3;
T Mary = N;
U Sevinç = 14.6;
;
int ana()

Yaşlar 7.sınıf;
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 etmek
ad 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 7.sınıf;
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şlar 7.sınıf;
cout << 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 etmek
ad alanı std kullanarak;
şablon yapı yaşları

int John = 11;
yüzer Peter = 12.3;
int Meryem = 13;
şamandıra Joy = 14.6;
;
int ana()

Yaşlar B seviyesi;
cout << gradeB.John << " << gradeB.Mary << '\n';
Yaşlar dereceC;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Yaşlar dereceD;
cout << gradeD.John << " << gradeD.Joy << '\n';
Yaş<> dereceA; //varsayılan gibi
cout << gradeA.John << " << gradeA.Joy << '\n';
0 döndür;

Çıktı:

11 13
12.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 etmek
ad alanı std kullanarak;
şablon void func (T no, U cha, const char *str )

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 etmek
ad alanı std kullanarak;
şablon void işlevi (T no, U cha, const char *str );
şablon void func (T no, U cha, const char *str )

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 etmek
ad alanı std kullanarak;
şablon void func (T no, U cha, const char *str )

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

şablon void işlevi (T no, const char *str )

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 etmek
ad 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 etmek
ad alanı std kullanarak;
şablon sınıf TheCla

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;
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 sınıf TheCla;
şablon sınıf TheCla

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 etmek
ad alanı std kullanarak;
şablon sınıf TheCla

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 U TheCla::ch = 'a';
int ana()

TheCla::eğlence('.');
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.

SuperTuxKart for Linux
SuperTuxKart is a great title designed to bring you the Mario Kart experience free of charge on your Linux system. It is pretty challenging and fun to...
Battle for Wesnoth Tutorial
The Battle for Wesnoth is one of the most popular open source strategy games that you can play at this time. Not only has this game been in developmen...
0 A.D. Tutorial
Out of the many strategy games out there, 0 A.D. manages to stand out as a comprehensive title and a very deep, tactical game despite being open sourc...