21 Ocak 2015 Çarşamba

C++ ve Operator

Giriş
C++ ile bir sınıfa tanımlanabilecek çok sayıda operator var. Aşağıda notlarım var.

Operator Sadece İfadenin Bir Tarafı Bizim Sınıfımız İse Kullanılabilir
Operator overloadin için ifadening sağ veya sol tarafından birisi user defined bir tip olmalı. Her iki tarafı da int olan bir ifadede örneğin / operatörünü overload edemeyiz.

== (Eşitlik) operatörü
Eşitlik operatörü iki şekilde kullanılabiliyor. Bunlar sınıfın == metodu olarak tanımlanması veya global bir metod olarak tanımlanması.

Sınıfın İçine Tanımlama
Metod parametresi ve metodun kendisi const olmalı
Örnek 
bool operator == (const ContourEdgeIndexes& rhs) const {} 
Global Tanımlama
Örnek:
bool operator == (var const& v1, var const& v2)
{
    return (v1.name == v2.name) && (v1.value == v2.value);
}
= (Değer Atama ) operatörü
Değer atama öperatörü eğer kodlanmamışsa derleyici tarafından otomatik üretilir.

Üretilen Operatör Nasıl Çalışır
Her bir elemanı teker teker diğer değişkene kopyalar.
The implicitly-defined copy assignment operator for class X performs memberwise assignment of its subobjects. ... Each subobject is assigned in the manner appropriate to its type
Kopyalanan değişken value array ise
Value array olsa bile doğru çalışır.
if the subobject is an array, each element is assigned, in the manner appropriate to the element type
Örnek'te struct1 ve struct2'nin sahip oldukları num dizisi deep copy olacak şekilde kopyalanır. struct1'in num dizisini değiştirsek bile struct2 etkilenmez.
struct myStruct {int num[3];};
myStruct struct1={{1,2,3}};
myStruct struct2;
struct2 = struct1;
Assignment Operatörü 3 Kısımdan Oluşur

Assignment operatörü 3 kısımdan oluşur.
l-value, assignment operator, value veya r-value. Normalde assignment operator C++, Java, C# gibi dillerde expression (yani ifade) olarak kabul edilir. Bazı daha az kullanılan dillerde ise Expression değil Statement olarak kabul edilir. Expression ve Statement (yani deyim) arasındaki fark şudur

Expression: Something which evaluates to a value. Example: 1+2/x
Statement: A line of code which does something. Example: GOTO 100

Aşağıdaki örnekte expression sonucunda bir değer çıkar ve x değişkeni z'nin değerini alır.
x = (y = z);    // ok, 'x' gets the value of 'z'

Assignment ve Initialization Farklı Şeylerdir

Değer atama operatörü çoğunlukla ilklendirme (initialization) aşamasında kafa karşıklığına sebep oluyor. Aşağıdaki kural netliği sağlar.
Initialization is not assignment.
Nesne ilk defa yaratılıyorsa = operatörü ile değer atansa bile, operatör metodu değil, constructor çağırılır. Örneğin aşağıdaki kodda std::string nesnesinin constructor'ı işletilir.
std::string a = "foo";
Bu kod parçası ise operatörü çağırır.
std::string a; a = "foo";

Assignment ve std::pair

std::pair için özel tanımlanmış  = operatörü bulunuyor.

Bu atama operatörü ile
std::pair <int,int> bar = std::make_pair (10.5,'A'); //ok: implicit conversion from pair<double,char>
yapılabilir.


-> operatörü
Bir sınıfı sarmalayan başka bir sınıf için tanımlanır.

MyObject* MyWrapper::operator -> ()
{
  return m_ptr;
}
++operatörü
Bu operatör aşağıdaki gibi tanımlanabilir.
Eğer pointer bir sınıfa pointer varsa ve ++operatörünü çağırmak istiyorsak aşağıdaki gibi yapabiliriz.
std::atomic_uint64_t* counter;
counter->operator++();
Dönüşüm Operatörleri - Conversion Operator
Dönüşüm operatörleri - Conversion Operator yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder