Yazılım Geliştirme: C ++ 'da gizli arama ve deyim konusunu ayarlama

Adanali

Active member
Yazılım Geliştirme: C ++ 'da gizli arama ve deyim konusunu ayarlama


  1. Yazılım Geliştirme: C ++ 'da gizli arama ve deyim konusunu ayarlama

Koenig arama olarak da bilinen arama (ADL) görünümünün konusunun arkasında, fonksiyonel konularına göre niteliksiz işlevleri aramak için bir dizi “büyülü” kural vardır. Gizli dil, konunun (ADL) ortamının görünümüne dayanmaktadır.










Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.













Konuyu ayarlamakta kal


Çünkü işe yarıyor “Hello World“Plan?



#include <iostream>

int main() {
std::cout << "Hello world";
}


Başka bir deyişle: Program neden çalışmamalı? Aşırı yük baskısında operatör << Im std-Tanımlı alanı adlandırın. Yani soru şu: Doğru aşırı yüklenmiş baskının operatörünü nasıl buluyorsunuz? std::string? Cevap ADL.

Wikipedia, ADL'nin güzel bir tanımını gösterir:



  • Konuyu ayarlamakta kal: C ++ programlama dilinde, konunun ayarlanması (ADL) veya konunun ayar adını aramak için arama, işlev çağrısına verilen konuların türlerine göre nitelikli olmayan bir işlev adı arayışı için geçerlidir. Bu davranış, Koenig'in araştırması olarak bilinir, çünkü genellikle Andrew Koenig'e atfedildiği için onun muciti olmadığını düşünmektedir.
İşte ADL kullanımının basit bir örneği:



// adl.cpp

namespace MyNamespace {
struct MyStruct {};
void function(MyStruct) {}
}

int main() {

MyNamespace::MyStruct obj;
function(obj); // (1)

}


Arama function(obj) (1) 'de araştırmayı uygulayan konu olmadan başarısız olur. ADL sayesinde, kalifiye olmayan isimlerin normal arayışına ek olarak, niteliksiz işlevsel adların aranmasında konuların alanı da dikkate alınmaktadır. Sonuç olarak, adın odasındaki fonksiyonel isim MyNamespace kurmak.

Şimdi ADL'nin ne anlama geldiğini biliyoruz. Ancak orijinal sorun henüz çözülmedi. Neden basit “Hello World“-Plan?



#include <iostream>

int main() {
std::cout << "Hello world";
}


C ++ sezgilerini deneyelim.



#include <iostream>

int main()
{
std::eek:perator<<(std::cout, "Hallo Welt"); // (1)
return 0;
}


Arama std::cout << "Hello World"; işlev çağrısı ile eş anlamlıdır operator<<(std::cout, "Hallo Welt"); (1). ADL, özel durumumuzda konularının isimlerinin alanını inceliyor. std::cout Anlar.

Gizli arkadaş deyimi


Konular için açılan araştırma, bir sınıfın genel arayüzünü genişletir: üye olmayan işlevler veya operatörler bu sınıfın genel arayüzünü genişletir. Şimdi gizli dil devreye giriyor:

friend-Sals veya operatörlerin sınıf içinde tanımlanan iki özel özelliği vardır:

  • Sınıfın özel üyelerine erişebilirsiniz
  • Bunlar, üye olmayanların işlevleri veya operatörleridir
İkinci nokta oldukça bilinmiyor ve C ++ sınıflarımda düzenli olarak açıklamam gerekiyor. Sınıfta tanımlanan arkadaşların bir işlevinin operatörlerin aşırı yüklenmesi için ilginç sonuçları vardır. friend-Sınıf içinde tanımlanan operatörler için sınıfın özel üyelerine erişebilirler, işlevlerin üyeleri değildir ve konuyu arayarak bulunurlar.



// hiddenFriend.cpp

#include <iostream>

class MyDistance{
public:
explicit MyDistance(double i):m(i){}

friend MyDistance operator +(const MyDistance& a,
const MyDistance& b){ // (1)
return MyDistance(a.m + b.m);
}

friend MyDistance operator -(const MyDistance& a,
const MyDistance& b){ // (2)
return MyDistance(a.m - b.m);
}

friend std::eek:stream& operator<< (std::eek:stream &out,
const MyDistance& myDist){ // (3)
out << myDist.m << " m";
return out;
}

private:
double m;

};


int main() {

std::cout << 'n';

std::cout << "MyDistance(5.5) + MyDistance(5.5): "
<< MyDistance(5.5) + MyDistance(5.5) << 'n'; // (4)

std::cout << "MyDistance(5.5) - MyDistance(5.5): "
<< MyDistance(5.5) - MyDistance(5.5) << 'n'; // (5)

std::cout << 'n';

}


(1), (2) ve (3) 'deki üç operatör de arkadaştır. İlgili operatörler + (4) içinde e - (5) 'de beklendiği gibi bulunurlar.

C ++ Insights bir kez daha operatörün aşırı yüklenmesinin büyüsünü gösterir.

Özellikle (4) 'deki ekleme (MyDistance(5.5) + MyDistance(5.5)) aşağıdakilere dönüştürülür: operator+(MyDistance(5.5), MyDistance(5.5)).

Son olarak, program baskısı:









Aksine, istiyorum friend-Aşırı yük operatöründen kaplama + kaldırmak.



class MyDistance{
public:
explicit MyDistance(double i):m(i){}

MyDistance operator +(const MyDistance& a,
const MyDistance& b){
return MyDistance(a.m + b.m);
}

friend MyDistance operator -(const MyDistance& a,
const MyDistance& b){
return MyDistance(a.m - b.m);
}

friend std::eek:stream& operator<< (std::eek:stream &out,
const MyDistance& myDist){
out << myDist.m << " m";
return out;
}

private:
double m;

};


Şimdi programın derlenmesi başarısız oluyor:









Operatörün tanımının ilk satırdaki kritik derleyici + Sadece sıfır veya bir konuya sahip olabilir (Hidden Friend: 9: 16). Olmadan friend-Klamat operatördür + bir üye işlevi ve bu nedenle örtük this-Pointer. Bu operatörün + Hepimizin üç konusu var. Sonuç olarak, derleyici doğru operatörü bulamaz + (Hidden Friend: 32: 75).

Sırada ne var?


Gizli arkadaş deyimine ek olarak, C ++ 'da sınıf tasarımı için başka bir deyim de vardır. Bir sonraki makalemde altıdan beşi veya altısı sıfır yazacağım.


(RME)




Ne yazık ki, bu bağlantı artık geçerli değil.

Boşa harcanan eşyalara olan bağlantılar, 7 günlük daha büyükse veya çok sık çağrılmışsa gerçekleşmez.


Bu makaleyi okumak için bir Haberler+ paketine ihtiyacınız var. Şimdi yükümlülük olmadan bir hafta deneyin – yükümlülük olmadan!
 
Üst