[C++/CLI编程宝典][4]第一个C++/CLI程序
一 本次通过一个简单的C++/CLI控制台程序,能使学习者有对C++/CLI程序有个个大概的印象,同时引出一些基本的概念和关键字。下面是程序代码:
#include <iostream>
#include <string>
// 1 ISOC++
public class NativeClass
{
public:
NativeClass(std::string str)
{
m_str = str;
std::cout << "ISOC++ 本地类型构造!" << std::endl;
}
~NativeClass()
{
std::cout << "ISOC++ 本地类型析构!" << std::endl << std::endl;
}
void Print()
{
std::cout << m_str << std::endl;
}
private:
std::string m_str;
};
// 2 C++/CLI
value struct ValueStruct
{
System::String^ m_str;
ValueStruct(System::String^ str)
{
m_str = str;
System::Console::WriteLine("托管value值类型构造!");
}
// 不能有析构函数
//~ValueStruct()
//{
// System::Console::WriteLine("托管value值类型析构!");
//}
void Print()
{
System::Console::WriteLine(m_str);
}
};
// 3 C++/CLI
ref class RefClass
{
public:
RefClass(System::String^ str)
{
m_str = str;
System::Console::WriteLine();
System::Console::WriteLine("托管ref引用类型构造!");
}
~RefClass()
{
System::Console::WriteLine("托管ref引用类型析构!");
System::Console::WriteLine();
}
void Print()
{
StartPrint();
System::Console::WriteLine(m_str);
EndPrint();
}
// 属性property,委托delegate和事件event
property System::String^ Str
{
System::String^ get() { return m_str; }
void set(System::String^ str) { m_str = str; }
}
delegate void PrintDelegate(void);
event PrintDelegate^ StartPrint;
event PrintDelegate^ EndPrint;
private:
System::String^ m_str;
};
void StartPrint()
{
System::Console::WriteLine("Print开始事件,马上开始Print函数调用!");
}
void EndPrint()
{
System::Console::WriteLine("Print结束事件,Print函数调用结束!");
}
void main()
{
NativeClass* pNC = new NativeClass("你好,我是ISOC++本地类型!");
pNC->Print();
delete pNC;
ValueStruct vs("你好,我是托管value值类型!");
vs.Print();
RefClass^ hRC = gcnew RefClass("你好,我是托管ref引用类型!");
hRC->StartPrint += gcnew RefClass::PrintDelegate(StartPrint);
hRC->EndPrint += gcnew RefClass::PrintDelegate(EndPrint);
hRC->Print();
hRC->Str = "你好,我是托管ref引用类型!现在正通过property属性修改成员feild字段!";
hRC->Print();
delete hRC;
}
二 下面逐步分析代码和简单解释一些新关键字和新名词:
1)类型NativeClass是ISOC++的类型,使用是使用new构造,使用完后然后delete。
2)类型ValueStruct为C++/CLI新的托管value值类型,直接使用,不需要new或gcnew,value值类型不能有析构函数,因此也不必delete,value值类型被分配在栈上。
3)类型RefClass为C++/CLI的新的托管ref引用类型,使用gcnew构造,用完后delete,也可以不delete,因为实际上Ref类型是的实例是分配在托管堆上的,内存由CLR的垃圾收集器来管理。
4)在RefClass我们可以看到C++/CLI中引入了新的关键字property属性,delegate委托和event事件。
三 上面的代码可以使用VS2008创建CLR的C++的console工程运行,新建工程的类型如下图:
运行后如下图:
完!