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:
Örnek:
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.
Value array olsa bile doğru çalışır.
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.
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.
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.
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.
Dönüşüm operatörleri - Conversion Operator yazısına taşıdım.
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 typeKopyalanan 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şurAssignment 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.
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 -> ()++operatörü
{
return m_ptr;
}
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;Dönüşüm Operatörleri - Conversion Operator
counter->operator++();
Dönüşüm operatörleri - Conversion Operator yazısına taşıdım.
Hiç yorum yok:
Yorum Gönder