C ++ Şablonları

Bu makalede, C ++ 'daki şablonlar hakkında bilgi edineceksiniz. Genel programlama için şablonların gücünü kullanmayı öğreneceksiniz.

Şablonlar, genel programlar yazmanıza izin veren C ++ 'ın güçlü özellikleridir. Basit bir ifadeyle, şablonları kullanarak farklı veri türleriyle çalışmak için tek bir işlev veya bir sınıf oluşturabilirsiniz.

Şablonlar, kodun yeniden kullanılabilirliği ve programların esnekliği amacıyla genellikle daha büyük kod tabanında kullanılır.

Şablon kavramı iki farklı şekilde kullanılabilir:

  • İşlev Şablonları
  • Sınıf Şablonları

İşlev Şablonları

Bir işlev şablonu, bir anahtar farkla normal bir işleve benzer şekilde çalışır.

Tek bir işlev şablonu aynı anda farklı veri türleriyle çalışabilir, ancak tek bir normal işlev yalnızca bir veri türü kümesiyle çalışabilir.

Normalde, iki veya daha fazla veri türü üzerinde aynı işlemleri gerçekleştirmeniz gerekirse, gerekli işlev bildirimiyle iki işlev oluşturmak için işlev aşırı yüklemesini kullanırsınız.

Bununla birlikte, daha iyi bir yaklaşım, işlev şablonlarını kullanmak olacaktır, çünkü aynı görevi daha az ve sürdürülebilir kod yazarak gerçekleştirebilirsiniz.

Bir işlev şablonu nasıl bildirilir?

Kelime ile bir fonksiyon şablon başlar şablon şablon parametre / s iç ardından işlev bildiriminde izlemektedir.

 şablon < T sınıfı > T bir işlev (T bağımsız değişken) (…)

Yukarıdaki kodda, T, farklı veri türlerini (int, float) kabul eden bir şablon bağımsız değişkendir ve class bir anahtar sözcüktür.

typenameYukarıdaki örnekte sınıf yerine anahtar kelime de kullanabilirsiniz .

Bir veri türünün bir argümanı iletildiğinde someFunction( ), derleyici someFunction()verilen veri türü için yeni bir sürüm oluşturur .

Örnek 1: En büyük sayıyı bulmak için İşlev Şablonu

İşlev şablonlarını kullanarak iki numara arasında en büyüğü görüntülemek için program

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Çıktı

İki tam sayı girin: 5 10 10 daha büyüktür. İki kayan noktalı sayı girin: 12,4 10,2 12,4 daha büyüktür. İki karakter girin: z Z z daha büyük ASCII değerine sahiptir.

Yukarıdaki programda, Large()veri tipinin iki argüman n1 ve n2'yi kabul eden bir fonksiyon şablonu tanımlanmıştır T. Targümanın herhangi bir veri türünde olabileceğini belirtir.

Large() işlev, basit bir koşullu işlem kullanarak iki bağımsız değişken arasında en büyüğünü döndürür.

İçinde main()fonksiyonu, üç farklı veri tiplerinin değişkenler: int, floatve charilan edilir. Değişkenler daha sonra Large()normal işlevler olarak işlev şablonuna aktarılır .

Çalışma zamanı sırasında, şablon işlevine bir tamsayı iletildiğinde, derleyici Large()int argümanlarını kabul etmek için bir işlev üretmesi gerektiğini bilir ve bunu yapar.

Benzer şekilde, kayan nokta verileri ve karakter verileri aktarıldığında, bağımsız değişken veri türlerini bilir ve Large()buna göre işlevi oluşturur .

Bu şekilde, yalnızca tek bir işlev şablonu kullanmak üç özdeş normal işlevin yerini aldı ve kodunuzun bakımını yapılabilir hale getirdi.

Örnek 2: İşlev Şablonlarını Kullanarak Veri Takas Etme

İşlev şablonlarını kullanarak verileri değiştirmek için program.

 #include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Çıktı

Verileri işlev şablonuna geçirmeden önce. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Verileri fonksiyon şablonuna geçirdikten sonra. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a

Bu programda, bir değer ileterek bir işlevi çağırmak yerine, başvuruya göre bir çağrı yapılır.

Swap()Fonksiyon şablon referans olarak iki argüman ve swapları onları alır.

Sınıf Şablonları

İşlev şablonları gibi, genel sınıf işlemleri için de sınıf şablonları oluşturabilirsiniz.

Bazen, tüm sınıflar için aynı olan bir sınıf uygulamasına ihtiyaç duyarsınız, yalnızca kullanılan veri türleri farklıdır.

Normalde, her veri türü için farklı bir sınıf oluşturmanız VEYA tek bir sınıf içinde farklı üye değişkenleri ve işlevler oluşturmanız gerekir.

Bu, kod tabanınızı gereksiz yere şişirecek ve bir değişiklik tüm sınıflarda / işlevlerde gerçekleştirilmesi gereken bir sınıf / işlev olduğundan, sürdürülmesi zor olacaktır.

Ancak sınıf şablonları, tüm veri türleri için aynı kodun yeniden kullanılmasını kolaylaştırır.

Bir sınıf şablonu nasıl ilan edilir?

 şablon < sınıf T> sınıf sınıfAdı (… genel: T var; T bazıOperasyon (T argüman);…);

Yukarıdaki bildirimde, Tkullanılan veri türü için bir yer tutucu olan şablon bağımsız değişkendir.

Sınıf gövdesinin içinde, bir üye değişken var ve bir üye işlevin someOperation()her ikisi de türdendir T.

Bir sınıf şablonu nesnesi nasıl oluşturulur?

Bir sınıf şablonu nesnesi oluşturmak için, bir zaman oluştururken veri türünü tanımlamanız gerekir .

 className classObject; 

Örneğin:

 className classObject; className classObject; className classObject; 

Example 3: Simple calculator using Class template

Program to add, subtract, multiply and divide two numbers using class template

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Output

 Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2 

In the above program, a class template Calculator is declared.

The class contains two private members of type T: num1 & num2, and a constructor to initalize the members.

It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult() to display the final output to the screen.

In the main() function, two different Calculator objects intCalc and floatCalc are created for data types: int and float respectively. The values are initialized using the constructor.

Notice we use and while creating the objects. These tell the compiler the data type used for the class creation.

This creates a class definition each for int and float, which are then used accordingly.

Ardından, displayResult()Hesap Makinesi işlemlerini gerçekleştiren ve çıktıyı görüntüleyen her iki nesneden de çağrılır.

Ilginç makaleler...