Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
C++ dilinde tür kavramı önemlidir. Her değişken, işlev bağımsız değişkeni ve işlev dönüş değeri; derlenebilmeleri için bir türe sahip olmalıdır. Ayrıca, tüm ifadelere (değişmez değerler dahil) değerlendirilmeden önce derleyici tarafından örtük olarak bir tür verilir. Türlere örnek olarak int
tamsayı değerlerini depolama, double
kayan nokta değerlerini depolama gibi yerleşik türler veya metin depolamak için sınıf std::basic_string
gibi Standart Kitaplık türleri verilebilir. veya class
tanımlayarak struct
kendi türünüzü oluşturabilirsiniz. türü, değişken (veya ifade sonucu) için ayrılan bellek miktarını belirtir. Türü ayrıca depolanabilecek değer türlerini, derleyicinin bu değerlerdeki bit desenlerini nasıl yorumladığını ve bunlar üzerinde gerçekleştirebileceğiniz işlemleri belirtir. Bu makale, C++ tür sistemiyle ilgili önemli özellikleri basit bir şekilde inceler.
Terminoloji
Skaler tür: Tanımlı aralığın tek bir değerini tutan bir tür. Skalerler aritmetik türleri (integral veya kayan nokta değerleri), numaralandırma türü üyelerini, işaretçi türlerini, işaretçiden üyeye türleri ve std::nullptr_t
içerir. Temel türler genellikle skaler türlerdir.
Bileşik tür: Skaler tür olmayan bir tür. Bileşik türler dizi türlerini, işlev türlerini, sınıf (veya yapı) türlerini, birleşim türlerini, numaralandırmaları, başvuruları ve statik olmayan sınıf üyelerine yönelik işaretçileri içerir.
Değişken: Bir veri miktarının sembolik adı. Ad, tanımlandığı kodun kapsamı boyunca başvurduğu verilere erişmek için kullanılabilir. C++ dilinde değişken genellikle skaler veri türlerinin örneklerine başvurmak için kullanılırken, diğer türlerin örnekleri genellikle nesneler olarak adlandırılır.
Nesne: Basitlik ve tutarlılık için, bu makalede bir sınıfın veya yapının herhangi bir örneğine başvurmak için nesne terimi kullanılır. Genel anlamda kullanıldığında, tüm türleri, hatta skaler değişkenleri içerir.
POD türü (düz eski veriler): C++ dilindeki bu resmi olmayan veri türleri kategorisi, skaler (Temel türler bölümüne bakın) veya POD sınıfları olan türleri ifade eder. POD sınıfının pod olmayan statik veri üyeleri yoktur ve kullanıcı tanımlı oluşturucular, kullanıcı tanımlı yıkıcılar veya kullanıcı tanımlı atama işleçleri yoktur. Ayrıca, bir POD sınıfının hiçbir sanal işlevi, hiçbir temel sınıfı ve hiçbir özel veya korumalı statik olmayan veri üyesi bulunmaz. POD türleri genellikle dış veri değişimi için örneğin, (yalnızca POD türleri olan) C dilinde yazılmış bir modül ile birlikte kullanılır.
Değişken ve işlev türlerini belirtme
C++ hem kesin olarak yazılan bir dil hem de statik olarak yazılan bir dildir; her nesnenin bir türü vardır ve bu tür hiçbir zaman değişmez. Kodunuzda bir değişken bildirdiğinizde, değişkenin türünü açıkça belirtmeniz veya derleyiciye türü başlatıcıdan çıkarmasını bildirmek için anahtar sözcüğünü kullanmanız auto
gerekir. Kodunuzda bir işlev bildirdiğinizde, işlevin dönüş değerinin türünü ve her bağımsız değişkenin türünü belirtmeniz gerekir. İşlev tarafından hiçbir değer döndürülmezse dönüş değeri türünü void
kullanın. Bunun istisnası, rastgele türlerin bağımsız değişkenlerine izin veren işlev şablonları kullanmanızdır.
Bir değişkeni ilk olarak bildirdikten sonra, daha sonraki bir noktada türünü değiştiremezsiniz. Ancak değişkenin değerini veya işlevin dönüş değerini farklı türde başka bir değişkene kopyalayabilirsiniz. Bu tür işlemler, bazen gerekli olan ancak aynı zamanda olası veri kaybı veya yanlışlık kaynakları olan tür dönüştürmeleri olarak adlandırılır.
POD türünde bir değişken bildirdiğinizde, başlatmanızı kesinlikle öneririz; bu da ona bir başlangıç değeri vermeniz anlamına gelir. Bir değişkeni başlatana kadar o bellek konumunda daha önce mevcut olan bit değerlerini içeren "çöp" değerine sahiptir. Özellikle sizin için başlatmayı işleyen başka bir dilden geliyorsanız, C++ dilinin anımsanacak önemli bir yönüdür. POD olmayan sınıf türünün değişkenini bildirdiğinizde oluşturucu başlatmayı işler.
Aşağıdaki örnek, her biri için bazı açıklamalar ile birlikte bazı basit değişken bildirimlerini gösterir. Örnek ayrıca derleyicinin tür bilgisini değişkende bulunan belirli sonraki işlemlere izin vermek veya bunları yasaklamak için nasıl kullandığını gösterir.
int result = 0; // Declare and initialize an integer.
double coefficient = 10.8; // Declare and initialize a floating
// point value.
auto name = "Lady G."; // Declare a variable and let compiler
// deduce the type.
auto address; // error. Compiler cannot deduce a type
// without an intializing value.
age = 12; // error. Variable declaration must
// specify a type or use auto!
result = "Kenny G."; // error. Can't assign text to an int.
string result = "zero"; // error. Can't redefine a variable with
// new type.
int maxValue; // Not recommended! maxValue contains
// garbage bits until it is initialized.
Temel (yerleşik) türler
Diğer dillerden farklı olarak, C++, diğer tüm türlerin türetildiği bir evrensel temel türe sahip değildir. Dil, yerleşik türler olarak da bilinen birçok temel türü içerir. Bu türler sırasıyla , , , , gibi int
sayısal türlerin yanı sıra double
ASCII ve UNICODE karakterleri için ve long
türlerini bool
içerir. char
wchar_t
En tam sayı temel türlerinin (, bool
, ve ilgili türler hariçdouble
) tümünün, değişkenin depolayabileceğiniz değer aralığını değiştiren sürümleri vardır wchar_t
unsigned
. Örneğin, 32 bit işaretli bir tamsayı depolayan bir int
, -2.147.483.648 ile 2.147.483.647 arasındaki bir değeri temsil edebilir. 32 bit olarak da depolanan bir unsigned int
, 0 ile 4.294.967.295 olan bir değeri depolayabilir. Her durumda olası değerlerin toplam sayısı aynıdır; yalnızca aralık farklıdır.
Derleyici bu yerleşik türleri tanır ve üzerinde gerçekleştirebileceğiniz işlemleri ve bunların diğer temel türlere nasıl dönüştürülebileceğini yöneten yerleşik kuralları vardır. Yerleşik türlerin tam listesi, bunların boyutu ve sayısal sınırları için bkz . Yerleşik türler.
Aşağıdaki çizimde, Microsoft C++ uygulamasındaki yerleşik türlerin göreli boyutları gösterilmektedir:
Aşağıdaki tabloda, Microsoft C++ uygulamasında en sık kullanılan temel türler ve bunların boyutları listelenmiştir:
Tür | Boyut | Yorum |
---|---|---|
int |
4 bayt | Tamsayı değerler için varsayılan seçim. |
double |
8 bayt | Kayan nokta değerleri için varsayılan seçim. |
bool |
1 bayt | True veya false olabilen değerleri temsil eder. |
char |
1 bayt | Daha eski C stili dizelerde veya std::string nesnelerde UNICODE'a dönüştürülmesi hiçbir zaman gerekmeyecek ASCII karakterler için kullanın. |
wchar_t |
2 bayt | UNICODE biçiminde (Windows'ta UTF-16, diğer işletim sistemlerinde değişiklik gösterebilir) kodlanmış olabilecek "geniş" karakter değerlerini temsil eder.
wchar_t , türündeki dizelerde kullanılan karakter türüdür std::wstring . |
unsigned char |
1 bayt | C++ yerleşik bayt türüne sahip değildir. Bayt değerini temsil etmek için kullanın unsigned char . |
unsigned int |
4 bayt | Bit bayrakları için varsayılan seçimdir. |
long long |
8 bayt | Çok daha büyük bir tamsayı değerleri aralığını temsil eder. |
Diğer C++ uygulamaları belirli sayısal türler için farklı boyutlar kullanabilir. C++ standardının gerektirdiği boyutlar ve boyut ilişkileri hakkında daha fazla bilgi için bkz . Yerleşik türler.
Türü void
Tür void
özel bir türdür; türünde void
bir değişken bildiremezsiniz, ancak ham (yazılmamış) bellek ayrılırken bazen gerekli olan türünde void *
bir değişken (işaretçi ) void
bildirebilirsiniz. Ancak, işaretçileri void
tür açısından güvenli değildir ve modern C++ dilinde kullanılmaları önerilmez. İşlev bildiriminde, void
dönüş değeri işlevin değer döndürmediği anlamına gelir; bunu dönüş türü olarak kullanmak yaygın ve kabul edilebilir bir kullanımıdır void
. C dili, parametre listesinde bildirmek void
için sıfır parametreye sahip işlevleri gerekli olsa da, örneğin, fn(void)
modern C++ dilinde bu uygulama önerilmez; parametresiz bir işlev bildirilmelidir fn()
. Daha fazla bilgi için bkz . Tür dönüştürmeleri ve tür güvenliği.
const
tür niteleyicisi
Yerleşik veya kullanıcı tanımlı herhangi bir tür anahtar sözcüğüyle nitelenebilir const
. Buna ek olarak, üye işlevleri -nitelenmiş const
ve hatta const
aşırı yüklenmiş olabilir. Bir const
türün değeri başlatıldıktan sonra değiştirilemez.
const double PI = 3.1415;
PI = .75; //Error. Cannot modify const variable.
const
Niteleyici, işlev ve değişken bildirimlerinde yaygın olarak kullanılır ve C++ dilinde "sabit doğruluk" önemli bir kavramdır; temelde, derleme zamanında değerlerin istemeden değiştirilmemesini garanti etmek için kullanılması const
anlamına gelir. Daha fazla bilgi için bkz. const
.
Tür const
, sürümündenconst
farklıdır; örneğin, const int
türünden int
ayrı bir türdür. Bir değişkenden sabitliğiconst_cast
gerektiğinde bu nadir durumlarda C++ işlecini kullanabilirsiniz. Daha fazla bilgi için bkz . Tür dönüştürmeleri ve tür güvenliği.
Dize türleri
Açıkça belirtmek gerekirse, C++ dilinin yerleşik dize türü yoktur; char
ve wchar_t
tek karakterleri depola - son geçerli karakteri (C stili dize olarak da adlandırılır) geçen dizi öğesine bir son null değer (örneğin, ASCII '\0'
) ekleyerek bir dizeyi yaklaşık olarak belirlemek için bu türlerden bir dizi bildirmeniz gerekir. C stili dizeler çok daha fazla kodun yazılmasını veya harici dize yardımcı program kitaplığı işlevlerini gerektirmekteydi. Ancak modern C++ dilinde Standart Kitaplık türleri std::string
(8 bit char
-tür karakter dizeleri için) veya std::wstring
(16 bit wchar_t
-tür karakter dizeleri için) vardır. Bu C++ Standart Kitaplık kapsayıcıları, uyumlu C++ derleme ortamlarına dahil edilen standart kitaplıkların bir parçası olduğundan yerel dize türleri olarak düşünülebilir.
#include <string>
Bu türleri programınızda kullanılabilir hale getirmek için yönergesini kullanın. (MFC veya ATL kullanıyorsanız, CString
sınıf da kullanılabilir ancak C++ standardının bir parçası değildir.) Null sonlandırılmış karakter dizilerinin (daha önce bahsedilen C stili dizeler) kullanımı modern C++ dilinde önerilmez.
Kullanıcı tanımlı türler
Bir class
, struct
, union
veya enum
tanımladığınızda, bu yapı kodunuzun geri kalanında temel bir tür gibi kullanılır. Bellekte bilinen bir boyuta sahiptir ve derleme zamanı denetimi için, çalışma zamanında ve programınızın kullanım süresi boyunca uygulanmak üzere nasıl kullanılacağına ilişkin belirli kuralları içerir. Temel yerleşik türler ve kullanıcı tanımlı türler arasındaki temel farklar şunlardır:
Derleyici kullanıcı tanımlı türde yerleşik bilgi içermez. Derleme işlemi sırasında tanımıyla ilk karşılaştığında türünü öğrenir.
Türünüz üzerinde gerçekleştirilebilecek işlemleri ve diğer türlere nasıl dönüştürülebileceğini, ilgili operatörleri sınıf üyeleri veya üye harici işlevler olarak tanımlayarak (aşırı yükleme ile) siz belirtirsiniz. Daha fazla bilgi için bkz. İşlev aşırı yüklemesi
İşaretçi türleri
C dilinin en eski sürümlerinde olduğu gibi, C++ özel bildirimciyi *
(yıldız işareti) kullanarak işaretçi türünün değişkenini bildirmenize izin verir. İşaretçi türü, gerçek veri değerinin depolandığı bellekteki konumun adresini saklar. Modern C++ dilinde, bu işaretçi türleri ham işaretçiler olarak adlandırılır ve kodunuzda özel işleçler *
(yıldız işareti) veya ->
(genellikle ok olarak adlandırılan büyüktür çizgi) aracılığıyla erişilir. Bu bellek erişim işlemi başvuru kaldırma olarak adlandırılır. Hangi işleci kullanacağınız, bir işaretçiyi skaler bir öğeye mi yoksa nesnedeki bir üyeye yönelik işaretçiyi mi geri aldığınıza bağlıdır.
İşaretçi türleri ile çalışma, uzun süredir C ve C++ program geliştirmenin en zor ve en kafa karıştırıcı taraflarından biri olmuştur. Bu bölümde, isterseniz ham işaretçilerin kullanılmasına yardımcı olacak bazı olgular ve uygulamalar özetlenmiştir. Ancak, modern C++ dilinde, akıllı işaretçinin evrimi nedeniyle (bu bölümün sonunda daha fazla açıklanmıştır) nesne sahipliği için ham işaretçilerin kullanılması artık gerekli değildir (veya önerilmez). Nesneleri gözlemlemek için ham işaretçileri kullanmak hala yararlıdır ve güvenlidir. Bununla birlikte, nesne sahipliği için bunları kullanmanız gerekiyorsa, bunu dikkatli bir şekilde ve sahip oldukları nesnelerin nasıl oluşturulduğunu ve yok edildiğini dikkatle dikkate alarak yapmalısınız.
Bilmeniz gereken ilk şey, ham işaretçi değişkeni bildiriminin yalnızca bir adresi depolamak için yeterli bellek ayırmasıdır: başvurulduğunda işaretçinin başvurduğu bellek konumu. İşaretçi bildirimi, veri değerini depolamak için gereken belleği ayırmaz. (Bu bellek, yedekleme deposu olarak da adlandırılır.) Başka bir deyişle, ham işaretçi değişkeni bildirerek gerçek bir veri değişkeni değil bellek adresi değişkeni oluşturursunuz. Bir işaretçi değişkeninin destek deposu için geçerli bir adres içerdiğini sağlamadan önce başvurmazsanız, programınızda tanımsız davranışlara (genellikle önemli bir hata) neden olur. Aşağıdaki örnek bu türde bir hata gösterir.
int* pNumber; // Declare a pointer-to-int variable.
*pNumber = 10; // error. Although this may compile, it is
// a serious error. We are dereferencing an
// uninitialized pointer variable with no
// allocated memory to point to.
Örnek, gerçek tamsayı verisini depolamak için ayrılmış herhangi bir belleği veya atanmış geçerli bir bellek adresi olmayan bir işaretçi türünün başvurusunu kaldırır. Aşağıdaki kod bu hataları düzeltir:
int number = 10; // Declare and initialize a local integer
// variable for data backing store.
int* pNumber = &number; // Declare and initialize a local integer
// pointer variable to a valid memory
// address to that backing store.
...
*pNumber = 41; // Dereference and store a new value in
// the memory pointed to by
// pNumber, the integer variable called
// "number". Note "number" was changed, not
// "pNumber".
Düzeltilen kod örneği, işaret eden pNumber
yedekleme depoyu oluşturmak için yerel yığın belleğini kullanır. Kolaylık olması için bir temel türü kullanıyoruz. Uygulamada, işaretçiler için yedekleme depoları genellikle bir anahtar sözcük ifadesi kullanılarak (C stili programlamada eski C çalışma zamanı kitaplığı işlevi kullanılmıştır) yığın (veya serbest depo) adı verilen new
bellek malloc()
alanında dinamik olarak ayrılan kullanıcı tanımlı türlerdir. Bu değişkenler ayrıldıktan sonra, özellikle bir sınıf tanımını temel alan nesneler olarak adlandırılır. ile new
ayrılan bellek, karşılık gelen delete
bir deyim tarafından silinmelidir (veya bunu ayırmak için işlevini kullandıysanızmalloc()
, C çalışma zamanı işlevi ).free()
Ancak, özellikle karmaşık kodda dinamik olarak ayrılmış bir nesneyi silmeyi unutmak kolaydır ve bu da bellek sızıntısı olarak adlandırılan bir kaynak hatasına neden olur. Bu nedenle, modern C++ dilinde ham işaretçilerin kullanılması önerilmez. Ham işaretçiyi akıllı bir işaretçiye sarmak neredeyse her zaman daha iyidir. Bu, yıkıcı çağrıldığında belleği otomatik olarak serbest bırakır. (Yani, kod akıllı işaretçi için kapsamın dışına çıktığında.) Akıllı işaretçileri kullanarak, C++ programlarınızdaki tüm hata sınıfını sanal olarak ortadan kaldırırsınız. Aşağıdaki örnekte, ortak yöntemi olan kullanıcı tanımlı bir tür olduğunu varsayalım MyClass
DoSomeWork();
void someFunction() {
unique_ptr<MyClass> pMc(new MyClass);
pMc->DoSomeWork();
}
// No memory leak. Out-of-scope automatically calls the destructor
// for the unique_ptr, freeing the resource.
Akıllı işaretçiler hakkında daha fazla bilgi için bkz . Akıllı işaretçiler.
İşaretçi dönüştürmeleri hakkında daha fazla bilgi için bkz . Tür dönüştürmeleri ve tür güvenliği.
genel olarak işaretçiler hakkında daha fazla bilgi için bkz . İşaretçiler.
Windows veri türleri
C ve C++ için klasik Win32 programlamasında çoğu işlev, parametre türlerini ve #define
dönüş değerlerini belirtmek için Windows'a özgü tür tanımlarını ve makroları (içinde windef.h
tanımlanır) kullanır. Bu Windows veri türleri çoğunlukla C/C++ yerleşik türlerine verilen özel adlardır (diğer adlar). Bu tür tanımlarının ve ön işlemci tanımlarının tam listesi için bkz . Windows Veri Türleri. ve gibi HRESULT
LCID
bu tür tanımlarından bazıları yararlı ve açıklayıcıdır. gibi INT
diğer kişilerin özel bir anlamı yoktur ve yalnızca temel C++ türlerinin diğer adlarıdır. Diğer Windows veri türleri C programlama ve 16-bit işlemci günlerinden kalma adlara sahiptir ve bu adların modern donanım veya işletim sistemlerinde herhangi bir amacı ya da anlamı yoktur. ayrıca, Windows Çalışma Zamanı Kitaplığı ile ilişkilendirilmiş ve Windows Çalışma Zamanı temel veri türleri olarak listelenen özel veri türleri de vardır. Modern C++'ta genel kılavuz, Windows türü değerin nasıl yorumlanması konusunda fazladan bir anlam belirtmediği sürece C++ temel türlerini tercih etmektir.
Daha Fazla Bilgi
C++ türü sistemi hakkında daha fazla bilgi için aşağıdaki makalelere bakın.
Değer türleri
Değer türlerini ve bunların kullanımıyla ilgili sorunları açıklar.
Tür dönüştürmeleri ve tür güvenliği
Ortak tür dönüştürme sorunlarını açıklar ve bunları nasıl engelleyeceğinizi gösterir.
Ayrıca bkz.
C++ 'a yeniden hoş geldiniz
C++ dil başvurusu
C++ Standart Kitaplığı