10 Aralık 2015 Perşembe

C++ Notlarım

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
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şken
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.
#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 metod
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.
void (&fr)() = foo;
fr();
veya
void (*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.

LValue
İ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ış.
  • Does it have a name ? lvalue : rvalue;
  • Can I take the address of it ? lvalue : rvalue;
signed
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 a char object can hold negative values. Characters can be explicitly declared unsigned or signed. Plain charsigned char, and unsigned 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 file
struct mystruct {int field1;int field2};
//.cpp file
const static mystruct m = {field1 = 1, field2= 2};
primitif veya komposit tip
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
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