IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  reklamver

Etiketlenen Kullanıcılar

Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 30 Ağustos 2013, 13:12   #1
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
CPP-0x - Genelleştirilmiş Sabit İfadeleri




C++0x - Genelleştirilmiş Sabit İfadeleri (Generalized Constant Expressions)

C++’a eklenmesine karar verilen yeni özelliklerden biri de genelleştirilmiş sabit ifadeleridir. Genelleştirilmiş sabit ifadeleri sayesinde sabit ifadesi belirttiği halde teknik olarak sabit ifadesi sayılmayan bazı ifadelerin de sabit ifadesi olarak kullanılmasının yolu açılmaktadır. Genelleştirilmiş sabit ifadeleri constexpr belirleyicisi kullanılarak oluşturulur. constexpr belirleyicisi nesne ve fonksiyon tanımlamasında ya da fonksiyon şablonu tanımlamasında kullanılabilir. Parametre değişkenlerinin bildiriminde constexpr belirleyicisi kullanılamaz. Taslaklardan alınmış aşağıdaki örnekleri inceleyiniz:

constexpr int square(int x) // geçerli, fonksiyon tanımlaması yapılmış
{
return x * x;
}

constexpr int bufsz = 1024; // geçerli, nesne tanımlaması yapılmış

constexpr struct pixel { // geçersiz, tür tanımlamalarında constexpr kullanılamaz!
int x;
int y;
};

int next(constexpr int x) // geçersiz, constexpr parametre değişkenleriyle kullanılamaz!
{
return x + 1;
}

extern constexpr int memsz; // geçersiz, constexpr yalnızca tanımlamalarda kullanılabilir!


Standart taslaklarında constexpr anahtar sözcüğü bir bildirim belirleyicisi (declaration specifier) olarak yer almaktadır:


decl-specifier:
storage-class-specifier
type-specifier
function-specifier
friend
typedef
constexpr
alignment-specifier


constexpr belirleyicisi fonksiyon tanımlamasında kullanıldığında fonksiyonu otomatik olarak inline yapar (yani constexpr fonksiyonlar tipik olarak başlık dosyalarında tanımlanmalıdır). Sınıfların başlangıç fonksiyonları (constructors) da constexpr belirleyicisi ile tanımlanabilir. Bir fonksiyon constexpr belirleyici ile tanımlanacaksa şu kurallara uyulmak zorundadır:

1.Fonksiyon virtual olamaz.
2. Fonksiyonun geri dönüş değeri ve parametre değişkenleri sınıf türünden olamaz. Aritmetik türlerden (int, long gibi), adres türlerinden (int *, long * gibi) ya da enum türlerinden olabilir. [1]
3.Fonksiyonların gövdeleri yalnızca aşağıdaki biçimde olmak zorundadır:

{
return ifade;
}

Yani gövde yalnızca return deyimi içerebilir.

4.return ifadesi parametre değişkenleri hariç, sabit ifadesi oluşturmalıdır. Örneğin:


constexpr int foo(int x)
{
return 3 + x;
}


Burada return ifadesi bu kurala uyuyor, fakat:

constexpr int foo(int x)
{
int y = 10;

return 3 + x + y;
}


Burada uymuyor.

5. Eğer return ifadesinde sınıf nesnesi varsa bu durumda sınıfın constexpr olan uygun bir tür dönüştürme operatör fonksiyonunun bulunması gerekir.

Taslaklardan alınan aşağıdaki örnekleri inceleyiniz:

constexpr int square(int x)
{
return x * x; // geçerli
}

constexpr long long_max()
{
return 2147483647; // geçerli
}

constexpr int abs(int x)
{
return x < 0 ? -x : x; // geçerli
}

constexpr void f(int x) // geçersiz, geri dönüş değeri void olamaz!
{
/* ... */
}

constexpr int prev(int x)
{
return --x; // geçersiz, ++ ve -- operatörleri sabit ifadesi oluşturmaz!
}

constexpr int g(int x, int n) // geçersiz, gövde yalnızca return deyiminden oluşmak zorundadır!
{
int r = 1;

while (--n > 0) r *= x;
return r;
}


constexpr ile tanımlanmış bir fonksiyon -eğer geçilen argümanlar sabit ifadesi ise- sabit ifadesi olarak kullanılabilir. Örneğin:

int a[square(3)];

Eğer square fonksiyonu con***pr olmasaydı bu bildirim geçersiz olurdu. Çünkü dizi uzunlukları sabit ifadeleriyle belirtilmek zorundadır.

constexpr nesne tanımlamasında kullanılabilir. Bu durumda nesne otomatik olarak const durumdadır. Fakat verilen ilkdeğerin sabit ifadesi olması gerekir. Örneğin:

constexpr int a = 10; // geçerli
constexpr int b = a + 20; // geçerli
int c = 10;
constexpr d = c + 30; // geçersiz!
const int e = c + 30; // geçerli


Görüldüğü gibi constexpr nesneye sabit ifadeleriyle ilkdeğer verilmesi zorunluyken const nesne için böyle bir zorunluluk yoktur.

Başlangıç fonksiyonları (constructors) constexpr olabilir. Bu durumda gövde boş olmalı ve tüm elemanlara MIL sintaksı ile ilkdeğer verilmelidir. Verilen ilkdeğerlerin de sabit ifadesi olması gerekir. Örneğin:

struct Length {
explicit constexpr Length(int i = 0) : val(i)
{}
private:
int val;
};


Daha ayrıntılı söz etmek gerekirse constexpr başlangıç fonksiyonları şu kısıtlara uymak zorundadır:

1) Parametre değişkenleri sınıf ya da yapı türünden olamaz. Aritmetik türlerden (int, long gibi), adres türlerinden (int *, long * gibi), enum türlerinden olabilir.

2) Fonksiyon, kendisini sarmalayan try bloğu (function try block) içeremez.

3) Fonksiyonun gövdesi boş olmak zorundadır.

4) Nesnenin taban sınıf kısmı ve static olmayan veri elemanları MIL sentaksıyla ilkdeğerlenmelidir. Burada kullanılan başlangıç fonksiyonları da constexpr olmalıdır.

5) MIL sentaksında verilen ilkdeğerlerin parametre değişkenleri dışında sabit ifadesi olması gerekir.

6) Eğer MIL sentaksında verilen ilkdeğerler sınıf türündense bu sınıfların dönüştürme yapan uygun bir con***pr tür dönüştürme operatör fonksiyonu olmalıdır.

Ayrıca sınıfın önemsiz kopya başlangıç fonksiyonu (trivial copy constructor) constexpr fonksiyon olarak kabul edilmektedir.

Bu makalede con***pr ile ilgili bazı ayrıntılara konu bütünlüğünün korunması amacıyla değinilmemiştir.

Alıntı

 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları eglen sohbet reklamver
Cevapla

Etiketler
cpp0x, genelleştirilmiş, sabit, İfadeleri


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Penguen İfadeleri:) yoSun Avatar ve Smiley 0 07 Ocak 2012 19:14