Plan des modifications
Mise à jour : novembre 2007
Ce plan propose des exemples de quelques-unes des modifications du langage entre Extensions managées pour C++ et Visual C++ 2008. Suivez le lien qui accompagne chaque élément pour obtenir plus d'informations.
Aucun mot clé à trait de soulignement double
Le trait de soulignement double qui précède tous les mots clés a été supprimé, à une exception près. Donc, __value devient value et __interface devient interface, etc. Pour empêcher des conflits de nom entre des mots clés et des identificateurs dans le code utilisateur, les mots clés sont essentiellement traités comme contextuels.
Consultez Mots clés de langage pour plus d'informations.
Déclarations de classe
Syntaxe des Extensions managées :
__gc class Block {}; // reference class
__value class Vector {}; // value class
__interface I {}; // interface class
__gc __abstract class Shape {}; // abstract class
__gc __sealed class Shape2D : public Shape {}; // derived class
Nouvelle syntaxe :
ref class Block {}; // reference class
value class Vector {}; // value class
interface class I {}; // interface class
ref class Shape abstract {}; // abstract class
ref class Shape2D sealed: Shape{}; // derived class
Consultez Les types managés pour plus d'informations.
Déclaration d'objet
Syntaxe des Extensions managées :
public __gc class Form1 : public System::Windows::Forms::Form {
private:
System::ComponentModel::Container __gc *components;
System::Windows::Forms::Button __gc *button1;
System::Windows::Forms::DataGrid __gc *myDataGrid;
System::Data::DataSet __gc *myDataSet;
};
Nouvelle syntaxe :
public ref class Form1 : System::Windows::Forms::Form {
System::ComponentModel::Container^ components;
System::Windows::Forms::Button^ button1;
System::Windows::Forms::DataGrid^ myDataGrid;
System::Data::DataSet^ myDataSet;
};
Consultez Déclaration d'un objet de classe de référence du CLR pour plus d'informations.
Allocation de tas géré
Syntaxe des Extensions managées :
Button* button1 = new Button; // managed heap
int *pi1 = new int; // native heap
Int32 *pi2 = new Int32; // managed heap
Nouvelle syntaxe :
Button^ button1 = gcnew Button; // managed heap
int * pi1 = new int; // native heap
Int32^ pi2 = gcnew Int32; // managed heap
Consultez Déclaration d'un objet de classe de référence du CLR pour plus d'informations.
Une référence de suivi à aucun objet
Syntaxe des Extensions managées :
// OK: we set obj to refer to no object
Object * obj = 0;
// Error: no implicit boxing
Object * obj2 = 1;
Nouvelle syntaxe :
// Incorrect Translation
// causes the implicit boxing of both 0 and 1
Object ^ obj = 0;
Object ^ obj2 = 1;
// Correct Translation
// OK: we set obj to refer to no object
Object ^ obj = nullptr;
// OK: we initialize obj2 to an Int32^
Object ^ obj2 = 1;
Consultez Déclaration d'un objet de classe de référence du CLR pour plus d'informations.
Déclaration de tableau
Le tableau CLR a été refondu. Il est similaire à la collection de modèles vector stl, mais correspond à la classe System::Array sous-jacente – autrement dit, il ne s'agit pas d'une implémentation de modèle.
Consultez Déclaration d'un tableau CLR pour plus d'informations.
Tableau comme paramètre
Syntaxe de tableau des extensions managées :
void PrintValues( Object* myArr __gc[]);
void PrintValues( int myArr __gc[,,]);
Nouvelle syntaxe de tableau :
void PrintValues( array<Object^>^ myArr );
void PrintValues( array<int,3>^ myArr );
Tableau comme type de retour
Syntaxe de tableau des extensions managées :
Int32 f() [];
int GetArray() __gc[];
Nouvelle syntaxe de tableau :
array<Int32>^ f();
array<int>^ GetArray();
Initialisation abrégée de tableau CLR local
Syntaxe de tableau des extensions managées :
int GetArray() __gc[] {
int a1 __gc[] = { 1, 2, 3, 4, 5 };
Object* myObjArray __gc[] = { __box(26), __box(27), __box(28),
__box(29), __box(30) };
return a1;
}
Nouvelle syntaxe de tableau :
array<int>^ GetArray() {
array<int>^ a1 = {1,2,3,4,5};
array<Object^>^ myObjArray = {26,27,28,29,30};
return a1;
}
Déclaration de tableau CLR explicite
Syntaxe de tableau des extensions managées :
Object* myArray[] = new Object*[2];
String* myMat[,] = new String*[4,4];
Nouvelle syntaxe de tableau :
array<Object^>^ myArray = gcnew array<Object^>(2);
array<String^,2>^ myMat = gcnew array<String^,2>(4,4);
Nouveauté du langage : initialisation de tableau explicite à la suite de gcnew
// explicit initialization list follow gcnew
// is not supported in Managed Extensions
array<Object^>^ myArray =
gcnew array<Object^>(4){ 1, 1, 2, 3 };
Propriétés scalaires
Syntaxe des propriétés en Extensions managées :
public __gc __sealed class Vector {
double _x;
public:
__property double get_x(){ return _x; }
__property void set_x( double newx ){ _x = newx; }
};
Nouvelle syntaxe des propriétés :
public ref class Vector sealed {
double _x;
public:
property double x
{
double get() { return _x; }
void set( double newx ){ _x = newx; }
} // Note: no semi-colon …
};
Nouveauté du langage : propriétés triviales
public ref class Vector sealed {
public:
// equivalent shorthand property syntax
// backing store is not accessible
property double x;
};
Consultez Déclaration de propriété pour plus d'informations.
Propriétés indexées
Syntaxe des propriétés indexées en Extensions managées :
public __gc class Matrix {
float mat[,];
public:
__property void set_Item( int r, int c, float value) { mat[r,c] = value; }
__property int get_Item( int r, int c ) { return mat[r,c]; }
};
Nouvelle syntaxe des propriétés indexées :
public ref class Matrix {
array<float, 2>^ mat;
public:
property float Item [int,int] {
float get( int r, int c ) { return mat[r,c]; }
void set( int r, int c, float value ) { mat[r,c] = value; }
}
};
Nouveauté du langage : propriété indexée de niveau de classe
public ref class Matrix {
array<float, 2>^ mat;
public:
// ok: class level indexer now
// Matrix mat;
// mat[ 0, 0 ] = 1;
//
// invokes the set accessor of the default indexer
property float default [int,int] {
float get( int r, int c ) { return mat[r,c]; }
void set( int r, int c, float value ) { mat[r,c] = value; }
}
};
Consultez Déclaration de l'index de la propriété pour plus d'informations.
Opérateurs surchargés
Syntaxe de la surcharge d'opérateur en Extensions managées :
public __gc __sealed class Vector {
public:
Vector( double x, double y, double z );
static bool op_Equality( const Vector*, const Vector* );
static Vector* op_Division( const Vector*, double );
};
int main() {
Vector *pa = new Vector( 0.231, 2.4745, 0.023 );
Vector *pb = new Vector( 1.475, 4.8916, -1.23 );
Vector *pc = Vector::op_Division( pa, 4.8916 );
if ( Vector::op_Equality( pa, pc ))
;
}
Nouvelle syntaxe de la surcharge d'opérateur :
public ref class Vector sealed {
public:
Vector( double x, double y, double z );
static bool operator ==( const Vector^, const Vector^ );
static Vector^ operator /( const Vector^, double );
};
int main() {
Vector^ pa = gcnew Vector( 0.231, 2.4745, 0.023 );
Vector^ pb = gcnew Vector( 1.475, 4.8916, -1.23 );
Vector^ pc = pa / 4.8916;
if ( pc == pa )
;
}
Consultez Opérateurs surchargés pour plus d'informations.
Opérateurs de conversion
Syntaxe de l'opérateur de conversion en Extensions managées :
__gc struct MyDouble {
static MyDouble* op_Implicit( int i );
static int op_Explicit( MyDouble* val );
static String* op_Explicit( MyDouble* val );
};
Nouvelle syntaxe de l'opérateur de conversion :
ref struct MyDouble {
public:
static operator MyDouble^ ( int i );
static explicit operator int ( MyDouble^ val );
static explicit operator String^ ( MyDouble^ val );
};
Consultez Modifications apportées aux opérateurs de conversion pour plus d'informations.
Substitution explicite d'un membre d'interface
Syntaxe de la substitution explicite en Extensions managées :
public __gc class R : public ICloneable {
// to be used through ICloneable
Object* ICloneable::Clone();
// to be used through an R
R* Clone();
};
Nouvelle syntaxe de la substitution explicite :
public ref class R : public ICloneable {
// to be used through ICloneable
virtual Object^ InterfaceClone() = ICloneable::Clone;
// to be used through an R
virtual R^ Clone();
};
Consultez Substitution explicite d'un membre d'interface pour plus d'informations.
Fonctions virtuelles privées
Syntaxe des fonctions virtuelles privées en Extensions managées :
__gc class Base {
private:
// inaccessible to a derived class
virtual void g();
};
__gc class Derived : public Base {
public:
// ok: g() overrides Base::g()
virtual void g();
};
Nouvelle syntaxe des fonctions virtuelles privées
ref class Base {
private:
// inaccessible to a derived class
virtual void g();
};
ref class Derived : public Base {
public:
// error: cannot override: Base::g() is inaccessible
virtual void g() override;
};
Consultez Fonctions virtuelles privées pour plus d'informations.
Type Enum du CLR
Syntaxe des enums en Extensions managées :
__value enum e1 { fail, pass };
public __value enum e2 : unsigned short {
not_ok = 1024,
maybe, ok = 2048
};
Nouvelle syntaxe des enums :
enum class e1 { fail, pass };
public enum class e2 : unsigned short {
not_ok = 1024,
maybe, ok = 2048
};
Outre cette légère modification syntaxique, le comportement du type d'enum du CLR a été modifié de plusieurs manières :
La déclaration anticipée d'un enum du CLR n'est plus prise en charge.
La résolution de la surcharge entre les types arithmétiques intégrés et la hiérarchie des classes Objet a été inversée entre Extensions managées et Visual C++ 2008. Un des effets secondaires est que les enums du CLR ne sont plus convertis implicitement en types arithmétiques.
Dans la nouvelle syntaxe, un enum du CLR conserve sa propre portée, ce qui n'est pas le cas en Extensions managées. Auparavant, les énumérateurs étaient visibles dans la portée contenant l'enum ; dorénavant, ils sont encapsulés dans la portée de l'enum.
Consultez Type Enum du CLR pour plus d'informations.
Suppression du mot clé __box
Syntaxe de la conversion boxing en Extensions managées :
Object *o = __box( 1024 ); // explicit boxing
Nouvelle syntaxe de la conversion boxing :
Object ^o = 1024; // implicit boxing
Consultez Handle de suivi d'une valeur boxed pour plus d'informations.
Pointeur épingle
Syntaxe du pointeur épingle en Extensions managées :
__gc struct H { int j; };
int main() {
H * h = new H;
int __pin * k = & h -> j;
};
Nouvelle syntaxe du pointeur épingle :
ref struct H { int j; };
int main() {
H^ h = gcnew H;
pin_ptr<int> k = &h->j;
}
Consultez Sémantique de type valeur pour plus d'informations.
Le mot clé __typeof devient typeid
Syntaxe de typeof en Extensions managées :
Array* myIntArray =
Array::CreateInstance( __typeof(Int32), 5 );
Nouvelle syntaxe de typeid :
Array^ myIntArray =
Array::CreateInstance( Int32::typeid, 5 );
Consultez typeof va à T::typeid pour plus d'informations.
Voir aussi
Concepts
Initiation à la migration de C++/CLI
Liste de vérification pour la mise à niveau de la syntaxe des extensions managées pour C++