科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual C++ .NET编程:托管C++概述

Visual C++ .NET编程:托管C++概述

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

托管是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完全可以把“托管”视为“.NET”

作者:Adding 来源:YESKY 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
(4) 简化属性操作

  在__gc类中可以使用.NET的属性,这个属性简化了属性函数的调用操作,这与标准C++中的属性不一样。在标准C++中分别通过get_和put_成员函数来设置或获取相关属性的值。现在,托管C++中的属性操作就好比是对一个属性变量进行操作,例如下列代码:

#using
using namespace System;

__gc class G {
public:
__property int get_Size() {
Console::WriteLine(S"get_属性");
return nSize;
};
__property void set_Size(int i) {
Console::WriteLine(S"set_属性");
nSize = i;
};
private:
int nSize;
};

int main() {
G * pG = new G;
pG->Size = 10; // 调用set_Size
int i = pG->Size; // 调用get_Size
Console::WriteLine(i);
}

  程序结果为:

   set_属性

   get_属性

   10

  需要说明的是,托管C++使用__property关键字来定义一个属性的成员函数。从代码中可以看出设置和获取属性的成员函数名称中分别使用了set_和get_,这样编译器会自动生成一个伪成员变量Size,这个变量名是set_和get_成员函数后面的名称。注意不要再在get_成员函数代码中使用这个伪成员变量Size,它会引起该函数的递归调用。

  (5) 托管C++的委派

  在C/C++中,一个函数的地址就是内存地址。这个地址不会带有任何其它附加信息,如函数的参数个数、参数类型、函数的返回值类型以及这个函数的调用规范等。总之,C/C++的回调函数不具备类型安全性。而.NET框架在回调函数的基础增加了提供类型安全的机制,称为委派。

  托管C++的委派方法不像C#那么复杂,它简化了委派绝大部分的内部机制,因而使得它的使用变成非常简单容易。例如下面的代码:

#using
using namespace System;

__delegate int GetDayOfWeek(); // 委派方法的声明
__gc class MyCalendar
{
public:
MyCalendar() : m_nDayOfWeek(4) {}
int MyGetDayOfWeek() {
Console::WriteLine("非静态方法");
return m_nDayOfWeek;
}
static int MyStaticGetDayOfWeek() {
Console::WriteLine("静态方法");
return 6;
}
private:
int m_nDayOfWeek;
};

int main(void)
{
GetDayOfWeek * pGetDayOfWeek; // 声明委派类型变量
int nDayOfWeek;

// 将类的静态方法MyStaticGetDayOfWeek绑定成委派
pGetDayOfWeek = new GetDayOfWeek(0, &MyCalendar::MyStaticGetDayOfWeek);
nDayOfWeek = pGetDayOfWeek->Invoke(); // 委派的调用
Console::WriteLine(nDayOfWeek);

// 将一个类的实例绑定成委派
MyCalendar * pcal = new MyCalendar();
pGetDayOfWeek =
static_cast(Delegate::Combine(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
nDayOfWeek = pGetDayOfWeek->Invoke();
Console::WriteLine(nDayOfWeek);

// 删除绑定委派的类实例
pGetDayOfWeek =
static_cast(Delegate::Remove(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));

return 0;
}

  输出结果是:

   静态方法
  
   6

   静态方法

   非静态方法

   4

  4、结速语

  总之,使用托管C++是C++程序员编写.NET框架应用程序最好的一种选择,在充分理解.NET框架基础上,避免了使用其他语言如C#、VB.NET所带来的额外开销。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章