Aracılığıyla paylaş


Kullanıcı Tanımlı Dönüşümler (C++/CLI)

Dönüştürme türlerinden bir başvuru ya da bir değer türü veya başvuru türü örneği olduğunda kullanıcı tanımlı dönüştürmeler (udc) Bu bölümde anlatılmaktadır.

Örtülü ve açık dönüştürme

Kullanıcı tanımlı bir dönüştürme ya da kapalı veya açık olabilir.Bir udc dönüştürme bilgi kaybına yol açmaz, örtülü olmalıdır.Aksi takdirde bir açık udc tanımlanmış olmalıdır.

Yerel sınıfının yapıcısına yerel bir sınıf için bir başvuru ya da değer türü dönüştürmek için kullanılabilir.

Dönüşümler hakkında daha fazla bilgi için bkz: Kutulama (C++ Bileşen Uzantıları) ve Standart dönüşümler.

// mcpp_User_Defined_Conversions.cpp
// compile with: /clr
#include "stdio.h"
ref class R;
class N;

value class V {
   static operator V(R^) {
      return V();
   }
};

ref class R {
public:
   static operator N(R^);
   static operator V(R^) {
      System::Console::WriteLine("in R::operator N");
      return V();
   }
};

class N {
public:
   N(R^) {
      printf("in N::N\n");
   }
};

R::operator N(R^) {
   System::Console::WriteLine("in R::operator N");
   return N(nullptr);
}

int main() {
   // Direct initialization:
   R ^r2;
   N n2(r2);   // direct initialization, calls constructor
   static_cast<N>(r2);   // also direct initialization

   R ^r3;
   // ambiguous V::operator V(R^) and R::operator V(R^)
   // static_cast<V>(r3);   
}

Çıktı

  

Arasında dönüştürme işleçleri

Arasında dönüştürme işleçleri işleç tanımlandığı sınıfın bir nesnesi bir nesneyi başka bir sınıf oluşturun.

Standart c++ arasında dönüştürme işleçleri desteklemez; Standart c++ kurucuları bu amaç için kullanır.Ancak, clr Türleri kullanırken, Visual c++ sağlar sözdizimsel desteği arasında dönüştürme işleçleri çağırmak için.

cls uyumlu başka dillerde de çalışmak için karşılık gelen arasında dönüştürme işleci ile belirli bir sınıf için her tekil kullanıcı tanımlı Oluşturucu kaydırmak isteyebilirler.

Arasında dönüştürme işleçleri:

  • Statik işlev olarak tanımlanan.

  • Olabilir, duyarlılık kaybı ya da, açık veya kapalı (için kısa-int gibi duyarlılık kaybı dönüştürme) olabilir.

  • Kapsayan sınıfı bir nesne döndürür.

  • Sorumlu tutulamaz "Kimden" türü olarak tek parametre türü.

Aşağıdaki örnek bir örtülü ve açık "convert yeri", kullanıcı tanımlı dönüştürme (udc) işleci gösterir.

// clr_udc_convert_from.cpp
// compile with: /clr
value struct MyDouble {
   double d;

   MyDouble(int i) {
      d = static_cast<double>(i);
      System::Console::WriteLine("in constructor");
   }

   // Wrap the constructor with a convert-from operator.
   // implicit UDC because conversion cannot lose precision
   static operator MyDouble (int i) {
      System::Console::WriteLine("in operator");
      // call the constructor
      MyDouble d(i);
      return d;
   }

   // an explicit user-defined conversion operator
   static explicit operator signed short int (MyDouble) {
      return 1;
   }
};

int main() {
   int i = 10;
   MyDouble md = i;
   System::Console::WriteLine(md.d);
 
   // using explicit user-defined conversion operator requires a cast  
   unsigned short int j = static_cast<unsigned short int>(md);
   System::Console::WriteLine(j);
}

Çıktı

  

İçin dönüştürme işleçleri

Operatör başka bir nesne için tanımlanan sınıfın bir nesnesi için dönüştürme işleçleri dönüştürür.Aşağıdaki örnek bir örtülü, dönüştürmek için kullanıcı tanımlı bir dönüştürme işleci gösterir:

// clr_udc_convert_to.cpp
// compile with: /clr
using namespace System;
value struct MyInt {
   Int32 i;

   // convert MyInt to String^
   static operator String^ ( MyInt val ) {
      return val.i.ToString();
   }

   MyInt(int _i) : i(_i) {}
};

int main() {
   MyInt mi(10);
   String ^s = mi;
   Console::WriteLine(s);
}

Çıktı

  

Bir açık kullanıcı tanımlı dönüştürme dönüştürme operatörü büyük olasılıkla bir şekilde veri kaybı dönüştürmeleri için uygundur.Açık dönüştürme için işlecini çağırmak için bir dönüştürme işlemi kullanılmalıdır.

// clr_udc_convert_to_2.cpp
// compile with: /clr
value struct MyDouble {
   double d;
   // convert MyDouble to Int32
   static explicit operator System::Int32 ( MyDouble val ) {
      return (int)val.d;
   }
};

int main() {
   MyDouble d;
   d.d = 10.3;
   System::Console::WriteLine(d.d);
   int i = 0;
   i = static_cast<int>(d);
   System::Console::WriteLine(i);
}

Çıktı

  

Generic sýnýflar dönüştürmek için

Generic bir sýnýf için t. dönüştürebilirsiniz

// clr_udc_generics.cpp
// compile with: /clr
generic<class T> 
public value struct V {
   T mem;
   static operator T(V v) {
      return v.mem;
   }
   
   void f(T t) {
      mem = t;
   }
};

int main() {
   V<int> v;
   v.f(42);
   int i = v;
   i += v;
   System::Console::WriteLine(i == (42 * 2) );
}

Çıktı

  

Dönüştürme yapıcı bir tür alır ve bir nesne oluşturmak için kullanır.Yalnızca doğrudan başlatma ile bir dönüştürme kurucusu çağrılır; yayınları dönüştürme oluşturucularını çağırır değil.Varsayılan olarak, dönüştürme kurucular clr türleri için açık.

// clr_udc_converting_constructors.cpp
// compile with: /clr
public ref struct R {
   int m;
   char c;

   R(int i) : m(i) { }
   R(char j) : c(j) { }
};

public value struct V {
   R^ ptr;
   int m;

   V(R^ r) : ptr(r) { }
   V(int i) : m(i) { }
};

int main() { 
   R^ r = gcnew R(5);

   System::Console::WriteLine( V(5).m);
   System::Console::WriteLine( V(r).ptr);
}

Çıktı

  

Bu kod örneğinde, bir statik bir örtük dönüştürme işlevi açık dönüştürme oluşturucu olarak aynı şeyi yapar.

public value struct V {
   int m;
   V(int i) : m(i) {}
   static operator V(int i) {
      V v(i*100);
      return v;
   }
};

public ref struct R {
   int m;
   R(int i) : m(i) {}
   static operator R^(int i) {
      return gcnew R(i*100);
   }
};

int main() {
   V v(13);   // explicit
   R^ r = gcnew R(12);   // explicit

   System::Console::WriteLine(v.m);
   System::Console::WriteLine(r->m);

   // explicit ctor can't be called here: not ambiguous
   v = 5;
   r = 20;

   System::Console::WriteLine(v.m);
   System::Console::WriteLine(r->m);
}

Çıktı

  

Ayrıca bkz.

Başvuru

Sınıflar ve Yapılar (C++ Bileşen Uzantıları)