现在的位置: 首页 > 综合 > 正文

[C++/CLI编程宝典][4]第一个C++/CLI程序

2017年10月31日 ⁄ 综合 ⁄ 共 2545字 ⁄ 字号 评论关闭

一 本次通过一个简单的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工程运行,新建工程的类型如下图:

运行后如下图:

完!

抱歉!评论已关闭.