<@乌龟:>C++/CLI语言Specification阅读笔记(1)
本笔记主要包含以下的内容:
转载请注明出处,如果有问题欢迎指教
1.如何在VC++2005或者2008中打开CLR支持
2.一个简单的Hello World程序
3.引用类型与值类型
4.常见CLI类型的定义
5.CLI中的数组(CLI::array)
6.统一类型的系统(System Unification)
1.如何在VC++2005或者2008中打开CLR支持
在当前的解决方案浏览器中选择解决方案,按右键,选择Property,在弹出的对话框的Configuration Properties的General菜单下选择Common Language Runtime Support中选择Common Language Runtime Support (/clr)选项,就可以正常使用.Net的内容了
2.一个简单的Hello World程序
using namespace System
int main()
{
System::Console::WriteLine("hello, world");
}
int main()
{
System::Console::WriteLine("hello, world");
}
3.引用类型与值类型
using namespace System;
ref class Class1
{
public:
int value;
Class1()
{
value = 0;
}
};
int main()
{
int val1 = 0;
int val2 = val1;
val2 = 123;
Class1^ ref1 = gcnew Class1;
Class1^ ref2 = ref1;
ref2->value = 123;
Console::WriteLine("Values: {0},{1}",val1,val2);
Console::WriteLine("Refs: {0},{1}",ref1->value,ref2->value);
}
ref class Class1
{
public:
int value;
Class1()
{
value = 0;
}
};
int main()
{
int val1 = 0;
int val2 = val1;
val2 = 123;
Class1^ ref1 = gcnew Class1;
Class1^ ref2 = ref1;
ref2->value = 123;
Console::WriteLine("Values: {0},{1}",val1,val2);
Console::WriteLine("Refs: {0},{1}",ref1->value,ref2->value);
}
注:
1) ^符号表示该类型为托管类型
2)gcnew与new的区别在与,gcnew是在托管堆上创建对象,可以实现自动的垃圾回收
3)ref代表该类型为托管的引用类型.
4.常见CLI类型的定义
public enum class Color
{
Red, Blue, Green
};
public value struct Point
{
int x, y;
};
public interface class IBase
{
void F();
};
public interface class IDerived: IBase
{
void G();
};
public ref class A
{
protected:
virtual void H()
{
Console::WriteLine("A.H");
}
};
public ref class B : A, IDerived
{
public:
virtual void F()
{
}
virtual void G()
{
}
protected:
virtual void H() override
{
}
};
public delegate void MyDelegate();
{
Red, Blue, Green
};
public value struct Point
{
int x, y;
};
public interface class IBase
{
void F();
};
public interface class IDerived: IBase
{
void G();
};
public ref class A
{
protected:
virtual void H()
{
Console::WriteLine("A.H");
}
};
public ref class B : A, IDerived
{
public:
virtual void F()
{
}
virtual void G()
{
}
protected:
virtual void H() override
{
}
};
public delegate void MyDelegate();
包含了常见的类型的定义
5.CLI中的数组(CLI:array)
using namespace System;
int main()
{
array<int>^ arr1D = gcnew array<int>(4){10,42,30,12};
Console::Write("The {0} elements are:", arr1D->Length);
for (int i = 0; i < arr1D.Length; i ++)
{
Console::Write("{0,3}", i);
}
Console::WriteLine();
array<int, 3>^ arr3D = gcnew array<int, 3>(10,20,30);
}
int main()
{
array<int>^ arr1D = gcnew array<int>(4){10,42,30,12};
Console::Write("The {0} elements are:", arr1D->Length);
for (int i = 0; i < arr1D.Length; i ++)
{
Console::Write("{0,3}", i);
}
Console::WriteLine();
array<int, 3>^ arr3D = gcnew array<int, 3>(10,20,30);
}
注:
1)array<int>^表示这是托管的数组
2)array可以是多维的数组,维度在array的建立的时候指定,如arr3D就是一个10*20*30的数组
6.统一类型的系统
using namespace System;
int main()
{
Console::WriteLine((3).ToString());
int i = 123;
Object^ o = i; //boxing
int j = safe_cast<int>(o); //unboxing
Console::WriteLine("{0}",j);
}
int main()
{
Console::WriteLine((3).ToString());
int i = 123;
Object^ o = i; //boxing
int j = safe_cast<int>(o); //unboxing
Console::WriteLine("{0}",j);
}
注:
在java或者c#中,都是采用同一类型的系统,即所有的类型都是集成自Object类型.而传统的C++不是这样,在CLI中,所有的类型都是集成自System::Object.
在上面程序中,数字3也具有ToString()方法.
另外一点就是装箱和拆箱的操作,在CLI中可以直接把值类型赋值给引用类型.叫做装箱操作,同样,调用safe_cast方法可以完成引用类型到值类型的转换,成为装箱操作.这些操作都是比较费时的
转载请注明出处,如果有问题欢迎指教