20 Temmuz 2018 Cuma

Brace Initialization - Array Aggregate

Giriş
Açıklaması şöyle.
If type is an array type, an array of objects is initialized.
  • If initializer is absent, each element is default-initialized
  • If initializer is an empty pair of parentheses, each element is value-initialized.
  • If initializer is a brace-enclosed list of arguments, the array is aggregate-initialized. (since C++11)
Aggregate ve Initializer List
Array bir aggreate olduğu için std::initializer_list alan bir constructor'a sahip değil. Bu yüzden karmaşık tanımlamalarda fazladan bir kıvırcık parantez kullanmak gerekiyor.
Örnek
Şöyle yaparız
std::array <std::pair<int, int>, 3> a{ { {1,2},{3,4},{5,6} } };
                                       ^                   ^
                                       |the inner aggregate|
Eleman Sayısından Az Değer Belirtmek
Örnek
Şöyle yaparız.
auto p1 = new int[10];    // valid
auto p2 = new int[10]();  // valid
auto p3 = new int[10]{5}; // valid

auto p4 = new int[10](5); // invalid
p3'ün ilk elemanı 5 olur. Diğer 9 eleman 0 olur.

Örnek
Şöyle yaparsak ilk 5 harfi ilklendiririz. 6. harf null olur.
class A
{
    char name[40] = { "Blank" };
};
Örnek
Şöyle yaparsak sadece ilk değere -1 atarız, geri kalan alanlara 0 atanır.
double * p = new double[10] {-1}
Örnek
Eğer bir diziyi belli bir değer ile ilklendirmek istersek en güzel yolu std::fill_n veya std::fill metodlarını kullanmak.
double *p = new double[10];

std::fill_n(p, 10, -1);
ya da  şöyle yaparız.
std::fill(p, p + 10, -1);
Eleman Sayısı Kadar Değer Belirtmek
Gramerde de görülebileceği gibi son elemandan sonra virgül gelebilir.
int x[] = {
    1,
    2,
    3,
};
Bir Önceki Elemanı Kullanmak
Elimizde şöyle bir kod olsun.
const int foo[2] = {13, foo[0] + 42};
Bu kod tehlikeli olabilir. Şöyle yapmak daha iyi.
constexpr int value = 13 ;
const int foo[2] = {value, value+42};

Hiç yorum yok:

Yorum Gönder