zoukankan      html  css  js  c++  java
  • [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工程运行,新建工程的类型如下图:



    运行后如下图:



    完!


    作者:iTech
    微信公众号: cicdops
    出处:http://itech.cnblogs.com/
    github:https://github.com/cicdops/cicdops

  • 相关阅读:
    c语言 9-3
    c语言 9-12
    c语言 9-11
    c语言 9-10
    c语言中实现字符串大小写的转换
    tyvj1106 登山
    tyvj1125 JR's chop
    tyvj1148 小船弯弯
    tyvj1087 sumsets
    tyvj1086 Elevator
  • 原文地址:https://www.cnblogs.com/itech/p/1368465.html
Copyright © 2011-2022 走看看