ComplexMath ^CM1=gcnew ComplexMath();
//C++/CLI中,C++ 类的对象仍然使用new 关键字创建。
DisplayComplex *DC1=new DisplayComplex();
RealMath *RM1=new RealMath();
C3=CM1->Add(C1,C2);
C4=CM1->Minus(C1,C2);
DC1->Display(C3);
DC1->Display(C4);
Console::WriteLine(RM1->Add(2,1));
Console::WriteLine(RM1->Minus(2,1));
//C++/CLI中,使用new 关键字创建的C++ 类的对象,仍然需要使用delete关键字删除。
delete DC1;
delete RM1;
return 0;
}
程序中Complex类使用value class关键字定义,属于.NET CTS值类型(Value Types);ComplexMath类使用ref class关键字定义,属于.NET CTS引用类型(Reference Types);DisplayComplex和RealMath类则使用class关键字定义,属于C++类,其中RealMath类的定义和实现还使用了#pragma unmanaged和#pragma managed编译指示,说明RealMath类编译成本机代码,而不编译成CIL代码,以实现混合Assembly。
程序编译运行后,得到了预期结果:
3+3i
1+1i
3
1
将编译后生成的可执行文件(Assembly)TypesSample1_CPP.exe使用IDA Pro 4.8反汇编(不要使用ildasm.exe反汇编),注意使用.NET Executable文件格式反汇编,检查生成的IL汇编语言程序,可以看到下列IL汇编语言代码(去掉了部分注释,还有一部分注释是笔者加的,下同):
……
//Complex类,从System.ValueType类派生,显然是值类型。
.class private sequential sealed ansi Complex extends [mscorlib]System.ValueType
{
.field public float64 Re
.field public float64 Im
.method public hidebysig specialname void .ctor(float64 Re, float64 Im)
{
ldarg.0
ldarg.1
stfld float64 Complex::Re
ldarg.0
ldarg.2
stfld float64 Complex::Im
ret
}
}
//ComplexMath类,从System.Object类派生,显然是引用类型。
.class private auto ansi ComplexMath extends [mscorlib]System.Object
{
.method public hidebysig value class Complex Add(value class Complex OpNum1, value class Complex OpNum2)
{
.locals (value class Complex V0)
ldloca.s 0
initobj Complex
ldloca.s 0
ldarga.s 1
ldfld float64 Complex::Re
ldarga.s 2
ldfld float64 Complex::Re
add
stfld float64 Complex::Re
ldloca.s 0
ldarga.s 1
ldfld float64 Complex::Im
ldarga.s 2
ldfld float64 Complex::I