C++

C++'da aşırı yükleme

C++'da aşırı yükleme
C++, iki tamsayı ekleyen ve bir tamsayı döndüren bir işlevin iki kayan nokta ekleyip bir kayan nokta döndürmesine izin vermez. İki tamsayı eklemek ve bir tamsayı döndürmek için bir işlev olduğunu hayal edin. Bir şamandıra döndürmek için iki veya daha fazla şamandıra ekleyen, aynı ada sahip başka bir işleve sahip olmak hoş olmaz mıydı?? Bunu yapmanın, ilk işlevi aşırı yükleme olduğu söylenir.

Aritmetik operatörler genellikle aritmetik işlemler için kullanılır. +'ya sahip olmak hoş değil mi, iki dizgeyi birleştir? Diziler için aritmetik toplama operatörünü aşırı yüklediği söylenen etkinleştirme.

Artırma operatörü, ++, bir int veya bir kayan nokta öğesine 1 ekler. İşaretçilerle uğraşırken, işaretçiye 1 eklemez. İşaretçinin bellekteki bir sonraki ardışık nesneye işaret etmesini sağlar. Bir yineleyici, bağlantılı listedeki bir sonraki nesneye işaret eder, ancak bağlantılı liste nesneleri bellekte farklı yerlerdedir (ardışık bölgelerde değil). Bir yineleyici için artış operatörünü aşırı yüklemek, artırmak, ancak bağlantılı listede aşağıdaki öğeye işaret etmek güzel olmaz mıydı??

Bu makale, C'de aşırı yüklemeyi açıklar++. İki bölüme ayrılmıştır: fonksiyon aşırı yüklemesi ve operatör aşırı yüklemesi. Makalenin geri kalanını anlamak için temel C++ bilgisine sahip olmak gereklidir.

Makale İçeriği

İşlev Aşırı Yüklemesi

Aşağıdaki işlev iki int ekler ve bir int döndürür:

int ekle(int no1, int no2)

int toplam = no1 + no2;
dönüş toplamı;

Bu fonksiyonun prototipi:
int add(int no1, int no2);
Noktalı virgülle biten, işlevin başlığındaki bir işlevin prototipi. Aynı ada sahip, ancak farklı bir prototipe sahip aşağıdaki işlev, üç kayan nokta ekler ve bir kayan nokta döndürür:
float add(float no1, float no2, float no3)

kayan nokta toplamı = no1 + no2 + no3;
dönüş toplamı;

Derleyici, iki veya daha fazla işlev aynı ada sahip olduğundan, hangi işlevin çağrılacağını nasıl ayırt eder?? Derleyici, hangi işlevin çağrılacağını belirlemek için argüman sayısını ve argüman türlerini kullanır. Aşırı yüklenmiş işlevlerin parametre listesi, sayıları ve/veya parametre türleri bakımından farklılık göstermelidir. Böylece, işlev çağrısı,

int sm = ekle(2, 3);

tamsayı işlevini çağırırken, işlev çağrısı,

float sme = ekle(2.3, 3.4, 2.0);

şamandıra işlevini çağırır. Not: Argüman sayısı aynı ancak farklı türde olduğunda, derleyicinin aşırı yüklenmiş bir işlevi reddedeceği durumlar vardır! - Sebep: - sonra bakınız.

Aşağıdaki program, yukarıdaki kod parçalarını harekete geçirir:

#Dahil etmek
ad alanı std kullanarak;
int ekle(int no1, int no2)

int toplam = no1 + no2;
dönüş toplamı;

float add(float no1, float no2, float no3)

kayan nokta toplamı = no1 + no2 + no3;
dönüş toplamı;

int ana()

int sm = ekle(2, 3);
cout<float sme = ekle(2.3, 3.4, 2.0);
cout<0 döndür;

Çıktı:
5
7.7

Operatör Aşırı Yüklemesi

Aritmetik operatörler, sınıf türlerinde işlemleri aşırı yüklemek için kullanılır. Yineleyici bir sınıf türüdür. Artırma ve eksiltme operatörleri, bir yineleyici için işlemleri aşırı yüklemek için kullanılır.

Örnek Dize Sınıfı Operatör Aşırı Yüklemesi

Bu bölüm, yay sınıfı olarak adlandırılan, basit bir şekilde tasarlanmış bir dize sınıfı için + aşırı yüklendiği bir örnek sağlar. + iki dize nesnesinin değişmez değerlerini birleştirir ve birleştirilmiş değişmez değerlerle yeni bir nesne döndürür. İki değişmez değeri birleştirmek, ikinci değişmez değeri birinci değişmezin sonuna birleştirmek anlamına gelir.

Artık C++, tüm sınıflar için operatör adı verilen özel bir üye işlevine sahiptir. Programcı, bu özel işlevi aşağıdaki gibi operatörleri aşırı yüklemek için kullanabilir: +. Aşağıdaki program, iki dize için + operatörünün aşırı yüklenmesini gösterir.

#Dahil etmek
ad alanı std kullanarak;
sınıf yayı

halka açık:
//veri üyeleri
karakter değeri[100];
int n;
char concat[100];
//üye fonksiyonlar
yay (karakter dizi[])

for (int i=0; ben<100; ++i)
val[i] = dizi[i];
if (dizi[i] == '\0')
kırmak;

int i;
için (i=0; ben<100; ++i) if (arr[i] == '\0') break;
n = ben;

yay operatörü+(yay& st)
int yeniLen = n + st.n;
char yeniStr[newLen+1];
for (int i=0; benfor (int i=n; bennewStr[newLen] = '\0';
yay nesnesi(newStr);
dönüş nesnesi;

;
int ana()

char ch1[] = "Senden nefret ediyorum! "; yay str1(ch1);
char ch2[] = "Ama seni seviyor!"; yay str2(ch2);
char ch3[] = "bir"; yay str3(ch3);
str3 = str1 + str2;
cout<0 döndür;

str1'in değeri "Senden nefret ediyorum! ". str2'nin değeri "Ama seni seviyor!". str3'ün değeri, yani str1 + str2, çıktıdır:

"Senden nefret ediyorum! Ama seni seviyor!"

bu, iki dize değişmezinin birleşimidir. Dizelerin kendileri somutlaştırılmış nesnelerdir.

Operatör fonksiyonunun tanımı, string sınıfının tanımının(tanımının) içindedir. "string" için "spring" dönüş türü ile başlar. Özel isim, "operatör, bunu takip et". Bundan sonra operatörün sembolü (aşırı yüklenecek) vardır. Daha sonra, aslında işlenen listesi olan parametre listesi vardır. + bir ikili operatördür: yani bir sol ve bir sağ işlenen alır. Ancak, C++ belirtimine göre, buradaki parametre listesi yalnızca doğru parametreye sahiptir. Ardından, sıradan operatör davranışını taklit eden operatör fonksiyonunun gövdesi vardır.

C++ belirtimine göre, + işleci tanımı yalnızca sağ işlenen parametresini alır, çünkü sınıf açıklamasının geri kalanı sol işlenen parametresidir.

Yukarıdaki kodda, yalnızca operatör+() işlev tanımı, + aşırı yükleme ile ilgilidir. Sınıf için kodun geri kalanı normal kodlamadır. Bu tanımın içinde, iki dize değişmezi, newStr[] dizisinde birleştirilir. Bundan sonra, newStr[] argümanı kullanılarak yeni bir string nesnesi oluşturulur (örneklenir). Operatör+() işlev tanımının sonunda, birleştirilmiş dizeye sahip yeni oluşturulan nesne döndürülür.

main() işlevinde, ekleme şu ifadeyle yapılır:

str3 = str1 + str2;

str1, str2 ve str3, main() içinde önceden oluşturulmuş dize nesneleridir. + ile birlikte "str1 + str2" ifadesi, str1 nesnesindeki operatör+() üye işlevini çağırır. str1 nesnesindeki operatör+() üye işlevi, argümanı olarak str2'yi kullanır ve birleştirilmiş dizeyle (geliştirilmiş) yeni nesneyi döndürür. Complete ifadesinin atama operatörü (=), str3 nesnesinin içeriğini (değişkenlerin değerleri) döndürülen nesneninkilerle değiştirir. main() işlevinde, eklemeden sonra str3 veri üyesinin değeri.val artık "bir" değildir; bu birleştirilmiş (ilave) dizedir, "Senden nefret ediyorum! Ama seni seviyor!". str1 nesnesindeki operatör+() üye işlevi, birleştirilmiş bir dize değişmez değeri bulmak için kendi nesnesinin dize değişmez değerini ve argümanının dize değişmez değerini, str2 kullanır.

Yineleyici Operatör Aşırı Yüklemesi

Yineleyici ile uğraşırken, en az iki nesne söz konusudur: bir bağlantılı liste ve yineleyicinin kendisi. Aslında, en az iki sınıf söz konusudur: bir bağlantılı listenin başlatıldığı bir sınıf ve bir yineleyicinin başlatıldığı bir sınıf.

Bağlantılı liste

Çift bağlantılı liste nesnesi için bir diyagram:

Bu listenin üç öğesi vardır, ancak daha fazlası da olabilir. Buradaki üç eleman tam sayıların elemanlarıdır. İlki 14 değerine sahiptir; bir sonraki değer 88'dir; ve sonuncusu 47 değerine sahip. Buradaki her eleman üç ardışık konumdan oluşur.

Bu, her öğenin bir konum olduğu ve tüm dizi öğelerinin ardışık konumlarda olduğu diziden farklıdır. Burada, farklı öğeler bellek dizisinde farklı yerlerde bulunur, ancak her öğe ardışık üç konumdan oluşur.

Her eleman için ortadaki konum değeri tutar. Doğru konum, bir sonraki öğenin işaretçisine sahiptir. Sol konum, önceki öğenin işaretçisine sahiptir. Son öğe için, doğru konum, listenin teorik bir sonuna işaret eder. İlk öğe için, sol konum, listenin teorik bir başlangıcına işaret eder.

Artırma operatörü (++) diziyle birlikte, fiziksel olarak bir sonraki konumu gösterecek şekilde işaretçiyi artırır. Liste ile, elemanlar bellekte ardışık bölgelerde değil. Böylece, artış operatörü aşırı yüklenebilir, yineleyiciyi (işaretçi) bir öğeden mantıksal olarak sonraki öğeye taşıyın. Aynı izdüşüm, azaltma operatörü (-) için de geçerlidir.

İleri yineleyici, devreye girdiğinde bir sonraki öğeye işaret eden bir yineleyicidir. Ters yineleyici, devreye girdiğinde önceki öğeye işaret eden bir yineleyicidir.

Aşırı yükleme ++ reklam -

Bu operatörlerin aşırı yüklenmesi, yineleyicinin sınıf açıklamasında (tanımı) yapılır.

Artış operatörü aşırı yüklemesinin prototipinin sözdizimi, önek,

ReturnType operatörü++();

Artış operatörü aşırı yüklemesinin prototipinin sözdizimi, postfix,

ReturnType operatörü++(int);

Azaltma operatörü aşırı yüklemesinin prototipinin sözdizimi, ön ek,

ReturnType operatörü--();

Artış operatörü aşırı yüklemesinin prototipinin sözdizimi, postfix,

ReturnType operatörü--(int);

Sonuç

Aşırı yükleme, bir işleve veya operatöre farklı bir anlam vermek anlamına gelir. İşlevler aynı kapsamda aşırı yüklendi. Aşırı yüklenmiş işlevleri farklı kılan, parametre listelerindeki parametre sayısı ve/veya türleridir. Parametre sayısının aynı olduğu, ancak farklı türlerde olduğu bazı durumlarda, derleyici aşırı yüklemeyi reddeder - daha sonra bakın. Nesnelerin örneklendiği sınıflarda birçok sıradan operatör aşırı yüklenebilir. Bu, sınıf açıklamasında operatör adlı özel işleve bir dönüş türü, parametre listesi ve gövde verilerek yapılır.

En İyi Oculus Uygulama Laboratuvarı Oyunları
Oculus başlık sahibiyseniz, yandan yükleme hakkında bilgi sahibi olmalısınız. Sideloading, kulaklığınıza mağaza dışı içerik yükleme işlemidir. SideQue...
Ubuntu'da Oynanacak En İyi 10 Oyun
Windows platformu, günümüzde doğal olarak Windows'u desteklemek için geliştirilen oyunların büyük bir yüzdesi nedeniyle oyun oynamak için hakim platfo...
Linux için En İyi 5 Arcade Oyunu
Günümüzde bilgisayarlar oyun oynamak için kullanılan ciddi makinelerdir. Yeni yüksek puanı alamazsan, ne demek istediğimi anlayacaksın. Bu yazıda, bug...