25 Kasım 2015 Çarşamba

Declaration ve Definiton

Declaration
Derleyiciye bir değişken, sınıf veya metodun tipi bildirilir. Değişken için bellek ayrılmaz."Genelde" header dosyasındaki satırlar declaration olarak tabir edilirler. Declaration örnekleri şöyle
extern int a;       // declares a
extern const int c; // declares c
int f(int);         // declares f
struct S;           // declares S
typedef int Int;    // declares Int
extern X anotherX;  // declares anotherX
using N::d;         // declares d

Definition
Bazı definition örnekleri şöyle
int a;                       // defines a
extern const int c = 1;      // defines c
int f(int x) { return x+a; } // defines f and defines x
struct S { int a; int b; };  // defines S, S::a, and S::b
struct X {                   // defines X
    int x;                   // defines non-static data member x
    static int y;            // declares static data member y
    X(): x(0) { }            // defines a constructor of X
};
int X::y = 1;                // defines X::y    
enum { up, down };           // defines up and down
namespace N { int d; }       // defines N and N::d
namespace N1 = N;            // defines N1
X anX;                       // defines anX
Değişken
Değişken için bellek ayrılır.
int bar;
Değişken için bellek ayrıldığı aşağıda yazılı.
6.7/5 Semantics A declaration specifies the interpretation and attributes of a set of identifiers. A definition of an identifier is a declaration for that identifier that:
— for an object, causes storage to be reserved for that object;
...
Metod
Metod vücut bulur.
int g(int lhs, int rhs) {return lhs*rhs;}

Struct
Struct define edilse bile bir değişken yaratılmazsa bellek ayrılmaz.
struct widget2 // defines structure widget2 that *would* take up ~8 bytes
{
    int thing1;
    int thing2;
};
Diğer kullanım şekilleri şöyle
struct widget x; // defines variable x of type struct widget
                 // which must be defined somewhere prior

struct widget2; // declares structure widget2
// does nothing except tells the compiler there will be some
// structure definition named widget2 coming later

int fn(widget2 *p); // OK widget2 need only be *declared* first

// NO
// struct widget2 y; // illegal - has not be defined yet

struct widget2 // defines structure widget2 that *would* take up ~8 bytes
{
    int thing1;
    int thing2;
} y; // defines variable y of type struct widget2 that *does* take up ~8 bytes

struct widget2 z[10]; // defines global variable z that *does* take up ~80 bytes
İçinde static alan barındıran struct'lar ise şöyledir.
struct X { // defines X
    static int y; // declares static data member y
};

int X::y = 1; // defines X::y








8 Kasım 2015 Pazar

STL Replace Algoritmaları

Giriş
STL algoritmalarını işlevlerine göre gruplamak anlamayı çok daha kolaylaştırıyor. Algoritmaları kullanmak için
#include <algorithm>
yapmak gerekir.

replace
Örnek ver

replace_if
Örnekte ' ' hariç geri kalan herşey, '_' karakterleri ile değiştiriliyor.
#include <algorithm>
#include <iostream>
#include <string>

int main()
{
  std::string str = "I like turtles";

  std::replace_if(str.begin(), str.end(), [](char ch){ return ch != ' '; }, '_');

  std::cout << str << '\n';
}


replace_copy
Örnek ver

replace_copy_if
Örnek ver

4 Kasım 2015 Çarşamba

std::is_function

Giriş
std::is_function tam 6 nokta alabilecek şekilde kodlanmış.
  /// is_function
  template<typename>
    struct is_function
    : public false_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...)>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes...) &&>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......)>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) &>
    : public true_type { };

  template<typename _Res, typename... _ArgTypes>
    struct is_function<_Res(_ArgTypes......) &&>
    : public true_type { };



Brace Initialization - Sınıflar

Giriş
Brace Initialization sınıflar, aggragate tipler ve daha bir çok şey için kullanılabiliyor. Bu yüzden kafalar karışıyor. Ben de tiplere göre ayırmaya karar verdim.

Not : Burada detaylı bir açıklama var ama ben anlamadım.

Copy List Initialization
= işaretinden sonra {} veya {...} şeklinde nesnenin ilklendirilmesidir. Geçici bir nesne yaratılır ve gerçek nesneye kopyalanır.

Parametresiz çağrılırsa
S s = {};     // the default constructor is invoked
Copy List Initialization ve Explicit Constructor
C++11 ile eğer sınıfın constructor metodu explicit ise derleme hatası alırız.
tuple<int, int> t2={1, 2}; // compile error
Bu durumda en azından sınıfı kurmak gerekir. Aşağıdaki örnekte direkt return 1 yazmak yerine T nesnesi ismen kuruluyor.
T func()
{
  return T{1};
}
Bu durum C++14 ile değişecek diye anlıyorum. Yani şu kod derlenecek
tuple<int, int> t2={1, 2}; 

Direct List Initialization
= işareti kullanmadan {} veya {...} şeklinde nesnenin ilklendirilmesidir. Constructor'ı çağırır
struct foo
{
    explicit foo(int);
};

foo f {42};    // OK