C++ Notlarım
Bilgisayarlar için ilk derleyicinin 1952 yılında Grace Hopper tarafından yazılmasından yıllar sonra ilk C++ derleyicisi 1979 yılında Bjarne Stroustrup tarafından geliştirildi. Aradan bunca zaman geçmiş olmasına rağmen C++ halen çok canlı ve gelişmeye devam ediyor.
C++ ISO Komitesi
C++ ISO komitesi tarafından yayınlanan bir standart.
C++11
C++11 (2011) veya C++03 (2003) desteğini etkinleştirmek için -std=c++0x ve -std=c++1y seçeneklerini kullanmak gerekir.
C++14 Keywordleri
Tüm tablo aşağıda
access modifier
Programlama Dillerinde Access Modifier Kullanımı Başlıklı yazıya taşıdım.
array
İlginç bir şekilde array asimetrik olarak kullanılabilir.Yani bir array'in 5. elemanına
auto değişken yazısına taşıdım.
bool
bool tipi yazısına taşıdım.
const değişken
const değişken C ve C++ arasında farklılık gösterir. C dilinde const bir değişkene değer atanmak zorunda değil. Yani ilklendidilmemiş şu C kodu derlenir.
Değişkenin adresi alınmadığı müddetçe const int veya #define ile bir değişken tanımlamanın modern derleyiciler için aynı şeydir.
Const metod nesneler (instance) ile kullanılır. Yani gizli bir this değişkeni varmış gibi düşünülebilir. Static ise nesneler ile çalışılmasını engeller. Dolayısıyla static ve const metod imzalarında yanyana gelemez. Gelirse derleyici şu hatayı verir.
error: static member function static .... cannot have cv-qualifier
constexpr
constexpr yazısına taşıdım.
constructor
C++ ile constructor yazısına taşıdım.
copy constructor
C++ ile copy constructor yazısına taşıdım.
copy Constructor Elision
Bazı durumlarda copy constructor çağırılmayabilir. Örnekler:
Eğer metod içinden dönen ve ismi olan nesne bir başka nesneyi ilklendirmek için kullanılıyorsa. Yani named return value optimization varsa. Örnek:
covariant return type
Covariance ve Contravariance yazısına taşıdım.
decltype
decltype yazısına taşıdım.
default constructor
Eğer sınıfın herhangi bir constructor metodu varsa, derleyici default constructor'ı otomatik olarak tanımlamaz.
constructor chaining
default constructor'lar otomatik olarak "constructor chain" işlemine tabidirler. Yani derleyici otomatik olarak bir üst sınıfın default constructor metodunu bizim için çağırır.
template
Default constructor'a template parametresi geçmek imkansızdır. Örnekte geçilen template sınıfa verilir.
destructor
destructor yazısına taşıdım.
dynamic_cast
dynamic_cast yazısına taşıdım.
enumeration
Konu için Enumeration ve String başlıklı yazıya bakabilirsiniz.
explicit
explicit yazısına taşıdım.
extern "C"
extern yazısına taşıdım.
friend
friend yazısına taşıdım.
function reference
function reference ve function pointer aynı işlevleri görürler. Sadece yazımları farklı. Ancak function reference hemen hiç kullanılmaz.
function pointer
Function Pointer başlıklı yazıya taşıdım.
Member function pointer
Function Pointer başlıklı yazıya taşıdım.
Functor
Functor, operator() metodunu tanımlayan bir sınıf. Her sınıfta olduğu gibi istenirse state saklamak mümkün. Bu durum, functional programming felsefesini ihlal etse de C++ bu esnekliği sağlıyor. Örnek:
ISO646.h
iso646.h dosyası include edilere birçok boolean logic operatörü yerine İngilizce kelimeler kullanılabilir.
Lambda
Konuyu Closure başlıklı yazıya taşıdım.
LValueBilgisayarlar için ilk derleyicinin 1952 yılında Grace Hopper tarafından yazılmasından yıllar sonra ilk C++ derleyicisi 1979 yılında Bjarne Stroustrup tarafından geliştirildi. Aradan bunca zaman geçmiş olmasına rağmen C++ halen çok canlı ve gelişmeye devam ediyor.
C++ ISO Komitesi
C++ ISO komitesi tarafından yayınlanan bir standart.
C++11
C++11 (2011) veya C++03 (2003) desteğini etkinleştirmek için -std=c++0x ve -std=c++1y seçeneklerini kullanmak gerekir.
C++14 Keywordleri
Tüm tablo aşağıda
alignas continue friend register true
alignof decltype goto reinterpret_cast try
asm default if return typedef
auto delete inline short typeid
bool do int signed typename
break double long sizeof union
case dynamic_cast mutable static unsigned
catch else namespace static_assert using
char enum new static_cast virtual
char16_t explicit noexcept struct void
char32_t export nullptr switch volatile
class extern operator template wchar_t
const false private this while
constexpr float protected thread_local
const_cast for public throw
access modifier
Programlama Dillerinde Access Modifier Kullanımı Başlıklı yazıya taşıdım.
array
İlginç bir şekilde array asimetrik olarak kullanılabilir.Yani bir array'in 5. elemanına
a[5] veya 5[a]
şeklinde erişebiliriz. Dolayısıyla aşağıdaki macrodaki 0[a] aslında a dizinin ilk elemanına erişiyor.#define ARRAY_LEN(a) (size_t) (sizeof(a) / sizeof(0[a]))
çok boyutlu array aşağıdaki gibi ilklendirilebilir.float y[3][3] = {
{ 1, 3, 5 },
{ 2, 4, 6 },
{ 3, 5, 7 }
};
auto değişkenauto değişken yazısına taşıdım.
bool
bool tipi yazısına taşıdım.
const değişken
const değişken C ve C++ arasında farklılık gösterir. C dilinde const bir değişkene değer atanmak zorunda değil. Yani ilklendidilmemiş şu C kodu derlenir.
#include <stdio.h>
int main()
{
const int a;
}
Aynı kod ise C++'ta hata verir.Değişkenin adresi alınmadığı müddetçe const int veya #define ile bir değişken tanımlamanın modern derleyiciler için aynı şeydir.
#define STD_VEC_HINT 6;
const int stdVecHint = 6;
const tanımlı bir değişkenin değerini değiştirmeye çalışmak tanımsız (undefined) bir işlemdir.const int a = 2;
int *b = &a;
*b =3;
const metodConst metod nesneler (instance) ile kullanılır. Yani gizli bir this değişkeni varmış gibi düşünülebilir. Static ise nesneler ile çalışılmasını engeller. Dolayısıyla static ve const metod imzalarında yanyana gelemez. Gelirse derleyici şu hatayı verir.
error: static member function static .... cannot have cv-qualifier
constexpr
constexpr yazısına taşıdım.
constructor
C++ ile constructor yazısına taşıdım.
copy constructor
C++ ile copy constructor yazısına taşıdım.
copy Constructor Elision
Bazı durumlarda copy constructor çağırılmayabilir. Örnekler:
Eğer metod içinden dönen ve ismi olan nesne bir başka nesneyi ilklendirmek için kullanılıyorsa. Yani named return value optimization varsa. Örnek:
covariant return type
Covariance ve Contravariance yazısına taşıdım.
decltype
decltype yazısına taşıdım.
default constructor
Eğer sınıfın herhangi bir constructor metodu varsa, derleyici default constructor'ı otomatik olarak tanımlamaz.
constructor chaining
default constructor'lar otomatik olarak "constructor chain" işlemine tabidirler. Yani derleyici otomatik olarak bir üst sınıfın default constructor metodunu bizim için çağırır.
template
Default constructor'a template parametresi geçmek imkansızdır. Örnekte geçilen template sınıfa verilir.
destructor
destructor yazısına taşıdım.
dynamic_cast
dynamic_cast yazısına taşıdım.
enumeration
Konu için Enumeration ve String başlıklı yazıya bakabilirsiniz.
explicit
explicit yazısına taşıdım.
extern "C"
extern yazısına taşıdım.
friend
friend yazısına taşıdım.
function reference
function reference ve function pointer aynı işlevleri görürler. Sadece yazımları farklı. Ancak function reference hemen hiç kullanılmaz.
void (&fr)() = foo;
fr();
veyavoid (*fp)() = &foo;
fp();
function pointer
Function Pointer başlıklı yazıya taşıdım.
Member function pointer
Function Pointer başlıklı yazıya taşıdım.
Functor
Functor, operator() metodunu tanımlayan bir sınıf. Her sınıfta olduğu gibi istenirse state saklamak mümkün. Bu durum, functional programming felsefesini ihlal etse de C++ bu esnekliği sağlıyor. Örnek:
ISO646.h
iso646.h dosyası include edilere birçok boolean logic operatörü yerine İngilizce kelimeler kullanılabilir.
Lambda
Konuyu Closure başlıklı yazıya taşıdım.
İsmi olan değişken gibi düşünülebilir. Örnek'te #define max 10 ile max lvalue olmayınca ++ operatörünün hata vereceği gösterilmiş.
LValue kullanan bir başka örneği aşağıdaki gibi çağırabiliriz:
int& get( int* array, int index ) { return array[index]; }
get( array, 5 ) = 5;
Assignment operatörü de lvalue döner. (a = b)++ işleminde a'nın değeri artar.
Move Constructor
Yazıyı buraya taşıdım.
Most Vexing Parse
Most Vexing Parse yazısına taşıdım.
Order of Evaluation
İşlem Sırası - Order of Evaluation başlıklı yazıya taşıdım.
Operator'lar
Konuyu C++ ve Operator başlıklı yazıya taşıdım.
Overloading
Konuyu Overloading başlıklı yazıya taşıdım.
Overloading ve Kalıtım
Konuyu Overloading başlıklı yazıya taşıdım.
Override
Konuyu Override Specifier başlıklı yazıya taşıdım.
Pass By Value
Int gibi küçük tipleri by value ile metoda geçirmek daha hızlı oluyormuş.
POD Type
Konuyu C++ Notlarım POD başlıklı yazıya taşıdım.
Register
Çok eskilerden kalan bir keyword. Artık kullanılmıyor diyebilirim. Derleyiciye belirtilen değişkeni bellek yerine bir register'a yerleştirmesini söyler. Derleyici yapmak zorunda değildir. Register'a yerleşen değişkenin tabiki adresi alınamaz.
int main(){
int* ptr;
int a;
register int b;
ptr = &a;
ptr = &b; //this won't compile
return 0;
}
RValue
RValue ismi olmayan ve adres operatorü ile erişilemeyen değer gibi düşünülebilir. Örnek:
int x = 3 + 4; ifadesinde 3+4 rvalue çünkü ifade bitince bu değerlere erişmenin yolu yok.
Burada da kural C++ gibi kodlanmış.
signed
- Does it have a name ? lvalue : rvalue;
- Can I take the address of it ? lvalue : rvalue;
signed anahtar kelimesi halen C++ dilinde duruyor. Sebebi ise sadece char tipinde kullanılabilmesi çünkü char tipinin signed veya unsigned olması gerektiği belirtilmemiş.
It is implementation-defined whether achar
object can hold negative values. Characters can be explicitly declared unsigned or signed. Plainchar
,signed char
, andunsigned char
are three distinct types.
sizeof
sizeof yazısına taşıdım.size_t
size_t ve rsize_t yazısına taşıdım.
static kelimesi
static kelimesi overloaded bir kelime. Değişkenler veya metodlar için kullanılabilir.
Global değişken, lokal değişken, member değişken, global metod, member metod için kullanılabilir.
Bir değişkeni veya C metodunu "internal linkage" yapar. Yani sadece kendi .cpp dosyası içinde erişilmesine izin verir.
static local
static local değişken yazısına taşıdım.
static const yapılara değer atama
struct
static const olan bir struct'ın alanlarına istenirse ismen değer atanabilir.Örnek:
//.h fileprimitif veya komposit tip
struct mystruct {int field1;int field2};
//.cpp file
const static mystruct m = {field1 = 1, field2= 2};
Primitif tipler .h dosyasında veya .cpp dosyasında ilklendirilebilir. Ancak diğer değişkenler .cpp dosyasında ilklendirilmelidir.
array
array aşağıdaki gibi ilklendirilir. Örnek:
const c::p c::pp[2] = { {1,1},{2,2} };Eğer array'imiz struct yerine default constructor'ı olmayan bir class olsaydı, bu sefer array'i aşağıdaki gibi aşağıdaki gibi ilklendirirdik.
const c::Abc a[10] = { Abc(1), Abc(2), ..... };Eğer array'imiz struct yerine explicit olmayan constructor'lı bir class olsaydı, bu sefer array'i aşağıdaki gibi ilklendirirdik.
const c::Abc a[10] = { 1, 2, ..... };
static_assert
static assert yazısına taşıdım.
String Sınıfı yazısına taşıdım.
Template ve Interface
Tuhaf olduğunu düşündüğüm bir yapı şöyle:
Template bir sınıf, aynı zamanda bir arayüzden türüyor. C++ ve STL içinde bu şekilde olan ve bence okuması zor olan bir kodlama şekli.
Template Default Parameter
Template default bir parametre tanımlıyorsa sadece <> işaratleri ile kullanılabilir.
template <int N = 10>
class X { };
X<> x; // this is an X<10>
Thread
Konuyu C++ ve Thread başlıklı yazıya taşıdım.
Typedef
typedef yazısına taşıdım.
Variadic Function
Variadic Function yazısına taşıdım.
Void
Void maalesef bir çok anlama gelen bir anahtar kelime. Metod imzasında dönüş tipi olarak kullanılıyorsa metod hiç bir sonuç dönmez anlamına gelir. (nothing)
void * olarak kullanılıyorsa ise bir şeye işaret eder anlamına geliyor (pointer to anything) Bu hiçbir şey ve bir şey tam tezat oluşturuyorlar.
C ve C++ arasındaki fark
C ve C++ arasında fark vardır. C dilinde bir metoda void yazılmaması, bu metodun değişken sayıda parametre alabileceği anlamına gelir. Parametre almayan metodlara void yazılması gerekir. Ancak C++ dilinde metoda parametre yazılmazsa kendiliğinden void olduğu farz edilir. Aradaki farkı gösteren bir örnek:
C++'ta şu metod parametre almayan metod anlamına gelir.
void fun();
C'de şöyle yaparız.void fun(void); // also works in c++ but it's frowned upon
Hiç yorum yok:
Yorum Gönder