Aracılığıyla paylaş


Dönüştürme işlevleri (C++)

Önceki bölümde açıklanan Kurucular tarafından dönüştürmede nesneleri, bir tür örtülü olarak belirli bir sınıf türü için dönüştürülebilir.Bu bölümde başka bir türe açıkça dönüştürmeleri verilen sınıf türünden sağlayan bir araç açıklanır.Sınıf türü dönüştürme genellikle dönüştürme işlevleri kullanılarak gerçekleştirilir.Dönüştürme işlevleri aşağıdaki sözdizimini kullanın:

Dilbilgisi

  • dönüştürme işlevi adı:
    işleç dönüştürme türü adı**()**

  • dönüştürme türü adı:
    tür belirleyici listesi ptr-operatöropt

Aşağıdaki örnek türü dönüştüren bir dönüştürme işlevi belirtir Money yazmak için double:

// spec1_conversion_functions1.cpp
struct Money {
   operator double() { return _amount; }

private:
    double _amount;
};

int main() {
   Money Account;
   double CashOnHand = Account;
}

Başlatılması CashOnHand ile Account türü dönüştürme neden Account yazmak için double.

(Kurucular) birlikte bir cast kullanıldığında, çağrılan işlevlerde olduklarından dönüştürme işlevleri genellikle "cast operators" denir.Aşağıdaki örnek, bir nesne türü geçerli değerini yazdırmak için cast veya açık dönüştürme kullanır Money:

cout << (double)Account << endl;

Dönüştürme işlevleri türetilmiş sınıflarda devralınır.Dönüştürme işleçleri yalnızca tam olarak aynı türe dönüştürmek temel sınıf dönüştürme işleçleri gizleyin.Bu nedenle, bir kullanıcı tanımlı operator int işlevi değil gizlemek kullanıcı tanımlı operator kısa bir taban sınıftaki işlevi.

Yalnızca bir kullanıcı tanımlı dönüştürme işlevi örtük dönüştürmeler yapılırken uygulanır.Hiçbir açıkça dönüştürme işlevi ise derleyici bir nesne dönüştürülebilir Ara türlerinde aramaz.

Bir dönüştürme gerekli değildir, bir Belirsizlik neden olur, bir hata oluşturulur.Ambiguities birden fazla kullanıcı tanımlı dönüştürme hazır olduğunda veya kullanıcı tanımlı dönüştürme ve yerleşik dönüştürme bulunduğunda ortaya çıkar.

Örnek

Olası belirsizlik ile sınıf bildirimi aşağıdaki örnekte gösterilmiştir:

// spec1_conversion_functions2.cpp
#include <string.h>
#include <stdio.h>

struct String {
   // Define constructor that converts from type char *.
   String( char *szBuffer ) {
      strcpy_s( _text, szBuffer );
   }

   // Define conversion to type char *.
   operator char *() {
      return _text;
   }

   int operator==( const String &s )  {
      return !strcmp( _text, s._text );
   }

private:
   char _text[80];
};

int main() {
   String s( "abcd\0" );
   char *ch = "efgh";

   // Cause the compiler to select a conversion.
   return s == ch; // C2666
}

İfade s == ch, derleyici iki seçenek ve doğru olduğunu belirleme hiçbir yolu vardır.Onu dönüştürebilirsiniz ch türünde bir nesne için String yapıcısını kullanarak ve kullanıcı tanımlı kullanarak karşılaştırma yapmak operator==.Ya da onu dönüştürebilirsiniz s bir işaretçi türü için char * dönüştürme kullanarak ve işlev işaretçileri karşılaştırmasını yapmak.

Her iki seçenek "daha dışında derleyici doğru" karşılaştırma deyimi ne anlama geldiğini belirleyemez ve bir hata üretir, çünkü.

Ayrıca bkz.

Başvuru

Dönüşümleri