type conversions c
C ++ 'da Desteklenen Çeşitli Tür Dönüşümlerine Göz Atın.
Önceki eğitimlerimizden C ++ 'da bulunan tüm veri türlerinden haberdar olmanızı umuyoruz. Bazen, bir türü diğerine dönüştürmemiz gereken bir ihtiyaç ortaya çıkabilir. Buna tür dönüştürme veya tür çevirme denir.
Bu eğiticide, C ++ 'da desteklenen çeşitli tür dönüşümlerini tartışacağız.
hangi cihaz ağ adresi çevirisi (nat) gerçekleştirir?
=> Ücretsiz C ++ Kursu İçin Buraya Tıklayın.
Ne öğreneceksin:
Tür Dönüşümleri
C ++ iki tür Tür Dönüşümünü destekler:
- Örtülü Tür Dönüşümü: Örtük tür dönüştürme otomatiktir. Bu tür bir dönüşümde kullanıcının herhangi bir müdahalesi yoktur ve derleyici dönüşümü doğrudan gerçekleştirir. Dönüştürme genellikle ifade içinde birden fazla veri türü olduğunda yapılır. Ancak genel olarak, bu tür bir dönüştürmede veri kaybı, işaret kaybı veya veri taşması olasılığı vardır.
- Açık Tür Dönüşümü: Açık tip dönüşümü kullanıcı tanımlıdır ve normalde 'tip atama' olarak adlandırılır. Burada kullanıcı, gereksinimlere bağlı olarak bir veri türünün bir değerini diğerine çevirir veya dönüştürür. Bu tür dönüşümler daha güvenlidir.
Şimdi her iki tür dönüştürme türünü ayrıntılı olarak göreceğiz.
Örtük Dönüşüm
Örtük dönüştürmede, bir ifade birden fazla veri türüne sahip olduğunda, derleyici bir veri türünden diğerine dönüştürmeleri gerçekleştirir. Veri kaybını önlemek için diğer veri türlerinin tüm değişkenleri en büyük veri türüne dönüştürülür. Buna terfi denir.
Bir kod Örneği kullanarak örtük dönüştürmeyi anlayalım.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Çıktı:
10 + 'A' = 75
float val (10 + 'a') = 107
var_int = 1000
Yukarıdaki kod örneği örtük dönüşümü gösterir. Sırasıyla 10 ve 'A' değerlerine sahip bir tamsayı ve bir karakter değişkeni tanımladık. Bu iki değişkeni topladığımızda örtük bir dönüşüm gerçekleşir.
Bu ifadede tamsayı daha büyük tür olduğundan, karakter değişken değeri 'A' tam sayı eşdeğerine, yani değer 65'e (ASCII değeri) dönüştürülür. Böylece ifadenin sonucu 75'tir.
Bir sonraki ifadede, tamsayı ve karakter ('a' -> 97) ekliyoruz ve ardından sonucu float'a atıyoruz. Böylece ifadenin sonucu, derleyici tarafından dolaylı olarak float'a dönüştürülür.
Üçüncü ifadede, kısa bir int değişkeni örtük olarak tamsayıya dönüştürülür.
Not : Örtülü dönüştürmeler durumunda, derleyici olası bir veri kaybı tespit ederse, bu etkiye yönelik bir uyarı yanıp sönebilir.
Açık Dönüşüm
Bir veri türünü başka bir veri türüne 'aktardığımız' için, açık dönüştürme 'tür dönüştürme' olarak da bilinir. Burada, derleyicinin dönüştürmeyi dahili olarak gerçekleştirdiği örtük dönüştürmenin aksine, kullanıcılar dönüştürmeyi açıkça tanımlar.
Açık dönüşümü iki şekilde gerçekleştirebiliriz:
# 1) Atama Operatörünü Kullanma
Atama operatörü kullanılarak bir şekilde açık dönüştürme veya tipleme zorla gerçekleştirilir. Burada, atama operatörünü kullanarak bir veri türünü başka bir veri türüne dönüştürüyor veya dönüştürüyoruz.
Genel sözdizimi şöyledir:
(data type) expression; Aşağıdaki Örnek bunu açıklamaktadır:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Çıktı:
Toplam = 5563
Zorunlu = 5563.2
Yukarıdaki örnekte atama operatörünü kullanarak açık çevrim gösterdik. İlk olarak, double türündeki değişken maaşını bir tamsayı türüne çeviriyoruz. Ardından, tamsayı değişken toplamını bir çift türe çeviriyoruz.
Çıktıda gösterildiği gibi, attığımız tür, ifadenin sonucunun son türünü gösterir.
Bu, kullanıcı gereksinimlere göre ifade türünü değiştirebildiği için avantajlıdır.
# 2) Yayın Operatörünü Kullanma
Bu tür dökümde, bir türden diğerine geçmek için tekli bir operatör olan bir 'döküm operatörü' kullanırız.
Döküm Türleri
Kullandığımız döküm operatörüne bağlı olarak aşağıdaki döküm türlerine sahibiz:
# 1) Statik Döküm
Statik çevrim, döküm operatörü kullanılarak yapılan tüm tipleme arasında en basit olanıdır. . Statik çevrim, örtük olarak gerçekleştirilen tüm dönüştürmeleri gerçekleştirebilir. Aynı zamanda birbiriyle ilişkili sınıfların işaretçileri arasında dönüşümler gerçekleştirir (yukarıdan -> türetilenden tabana veya aşağıya doğru -> tabandan türetilene).
Yukarıda listelenen dönüştürmelerden ayrı olarak, statik çevrim herhangi bir işaretçiyi boşluğa * dönüştürebilir.
PC'de mkv nasıl oynanır
Statik çevrim, derlenmiş zaman dökümdür. Bu, gerçekleştirilen atamanın geçerli olup olmadığını görmek için çalışma zamanında hiçbir kontrol yapılmadığı anlamına gelir. Bu nedenle, dönüşümün güvenli ve geçerli olmasını sağlamak programcının sorumluluğundadır.
Diğer bir deyişle, kullanıcı, dönüştürülen nesnenin hedef veri türüne göre dolu olduğundan emin olmalıdır.
Statik bir atama işlemini şu şekilde belirtiyoruz:
static_cast (expression) Bir Örnek kullanarak Statik atımı anlayalım.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '< Şimdi yukarıdaki kodu aşağıdaki gibi değiştirelim:
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting :df = '<Yukarıdaki örnekte, 'A' değerine sahip bir karakter değişkeni içerecek şekilde kodu biraz değiştirdik. Sonra bir tamsayı işaretçisi bildiririz ve bir karakteri tamsayı işaretçisine dönüştürmek için statik bir çevrim uygularız.
Bu programı derlediğimizde aşağıdaki çıktıyı alıyoruz.
'İnt main ()' işlevinde:
10:35: hata: 'char *' türünden 'int *' yazmak için geçersiz static_cast
Program geçersiz olduğu için yapılan statik atama için bir hata veriyor. Bu nedenle, statik çevrim sadece geçerli tip çevrimlere veya dönüştürmelere izin verir ve bazı istenmeyen tipleme yapmaya çalıştığımızda hata verir.
# 2) Dinamik Yayın
Dinamik yayın, dönüştürmenin geçerliliğini kontrol etmek için gerçekleştirilen bir çalıştırma zamanıdır. Dinamik yayın yalnızca sınıf işaretçileri ve referanslarda gerçekleştirilir. Atama başarısız olursa ifade bir NULL değeri döndürür.
Dinamik yayın, şu şekilde bilinen bir mekanizma kullanır: RTTI (Çalışma Zamanı Tipi Tanımlama) . RTTI, nesnenin veri türü hakkındaki tüm bilgileri çalışma zamanında kullanılabilir hale getirir ve yalnızca en az bir sanal işlevi (polimorfik tür) olan sınıflar için kullanılabilir. RTTI, çalışma zamanında veya yürütme sırasında nesne türünün belirlenmesine izin verir.
Dinamik oyuncuları anlamak için bir Örnek deneyelim.
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }Bu programda, sanal bir fonksiyona sahip taban ve taban sınıfı olan bir türetilmiş olmak üzere iki sınıf tanımladık.
Ana işlevde, temel sınıf göstericisi tarafından gösterilen türetilmiş bir sınıf nesnesi oluştururuz. Ardından, türetilmiş bir sınıf işaretçisine dönüştürmek için türetilmiş bir sınıfa işaret eden temel işaretçide dynamic_cast gerçekleştiririz.
Temel sınıfta olduğu gibi, taban polimorfiktir (sanal işlev içerir), dinamik yayın başarılıdır.
Not: Sanal işlevi yukarıdaki sınıftan kaldırırsak, nesneler için RTTI bilgisi kullanılamayacağından dynamic_cast başarısız olacaktır.
Dinamik döküm, çalışma zamanında tip güvenliği ek yüküne sahiptir.
# 3) Cast'ı Yeniden Yorumlayın
Bu tür dönüştürme, sınıflar birbiriyle ilişkili olmadan herhangi bir nesne türü üzerinde çalıştığı için kullanımı en tehlikelidir.
Reintepret_cast, herhangi bir işaretçi üzerinde çalışır ve işaretçilerin birbiriyle ilişkili olup olmadığına bakılmaksızın, herhangi bir türdeki bir işaretçiyi başka bir türe dönüştürür. İşaretçinin gösterdiği verinin veya işaretçinin aynı olup olmadığını kontrol etmez.
Yayın operatörü yalnızca bir parametre alır, kaynak işaretçisi dönüştürülür ve herhangi bir değer döndürmez. Basitçe işaretçi tipini dönüştürür.
Gerekmedikçe kullanmamalıyız. Genellikle kaynak işaretçiyi orijinal türüne çeviririz.
Çoğunlukla bitlerle çalışmak için kullanırız. Boole değerlerinde kullanıldığında, boole değerleri tamsayı değerlerine, yani doğru için 1 ve yanlış için 0'a dönüştürülür.
beyaz kutu testi ile kara kutu testi arasındaki fark
Yeniden Yorumlama dökümüne bir Örnek görelim:
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; } Çıktı:
0x3ef3090
-e
97
-e
Yukarıdaki örnekte, 97 değerini gösteren bir tamsayı işaretçisi ptr bildirdik. Sonra, bir karakter işaretçisi ch bildirip kullanarak ona ptr atıyoruz.
Ardından çeşitli değerler yazdırıyoruz. İlk yazdırdığımız ptr, bir tamsayı konumuna işaret ediyor. Dolayısıyla bir adres yazdırır.
Bir sonraki ch değeri 97 değerini içerir ve bu nedenle ASCII 97'ye eşdeğer olan 'a' yazar. Bir sonraki değer olan '* ptr' 97 değerini tutarken '* ch' 97 yani ASCII eşdeğerini tutar, yani 'a' reinterpret_cast.
# 4) Sabit Oyuncular
Yayın operatörü, kaynak işaretçinin sabitliğini değiştirmek veya işlemek için kullanılır. Manipülasyonla, ya sabitliği const olmayan bir işaretçiye ayarlamak ya da bir const işaretçisinden sabitliği kaldırmak anlamına geliyoruz.
Operatörü başarılı bir şekilde atmanın koşulu, dönüştürülen işaretçi ve kaynağın aynı türde olması gerektiğidir.
Bunu anlamak için bir örnek alalım.
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }Bu örnekte, 'printVal' fonksiyonunun const olmayan bir gösterici kabul ettiğini görüyoruz. Ana işlevde, const pointer ptr'ye atanmış bir const değişkenimiz 'değer' var.
Bu const işaretçisini printVal işlevine geçirmek için, sabitliği kaldırmak için uygulayarak dönüştürüyoruz. Ardından istenen sonuçları elde etmek için ptr_cast işaretçisini işleve iletiriz.
Sonuç
Bununla, bu tür dönüştürme konusunu C ++ 'da özetleyeceğiz. C ++ 'da kullanılan örtük ve açık dönüştürmeleri gördük.
Bununla birlikte, veri kaybını ve bu tür diğer zorlukları önlemek için, dönüştürme veya tipleme işlemlerinin ancak durumun kullanımı gerektirmesi durumunda akıllıca uygulanması gerektiğinin bilinmesi gerekir.
=> Yeni Başlayanlar C ++ Eğitim Kılavuzuna Buradan Dikkat Edin.
Önerilen Kaynaklar
- En İyi ÜCRETSİZ C # Eğitim Serisi: Yeni Başlayanlar İçin En İyi C # Rehberi
- C ++ 'da Tip Niteleyicileri ve Depolama Sınıfları
- Geçiş Testi Türleri: Her Tür İçin Test Senaryoları ile
- Bir Proje İçin Hangi Tür Testin Gerekli Olduğuna Nasıl Karar Verilir? - Manuel veya Otomasyon
- C ++ Veri Türleri
- HP LoadRunner Öğreticileriyle Yük Testi
- C ++ 'da Değişkenler
- Örneklerle C ++ 'da Şablonlar