C++/CLI(七):类函数
来源:互联网 发布:淘宝安全中心找回密码 编辑:程序博客网 时间:2024/05/17 04:00
类函数是C++/CLI中引入的新概念,其功能类似于函数模板,但原理上却迥然不同。使用函数模板时,编译器根据模板生成函数源代码,然后将其与其它代码 一起编译。这种方法可能会产生许多函数,从而使得生成模块的体积增加,这就是所谓的“代码膨胀”。类函数与之不同,类函数本身将被编译,在调用类函数时, 实际类型在运行时取代了类函数的类型形参,这不会导致新增代码的问题。
一、类函数的定义
类函数与普通函数的区别在于:它需要定义一个特殊的形参——类型形参,该参数说明在运行时传递给函数的参数类型。下面的例子定义了一个类函数,用于找出某种数据类型数组中最大的元素。
generic<typename T> where T:IComparableT MaxElement(array<T>^ x){ T max = x[0]; for(int i=1; i<x->Lenght; i++) if(max->CompareTo(x[i])<0) max = x[i]; return max;}
关键字generic规定后面的内容为类函数定义,尖括号内用关键字typename定义了一个类型形参T,如果有多个类型形参,它们都放在尖括号内,用逗号分开。
关键字where引入使用类函数时,传递给T的类型实参应满足的约束条件。这里的条件是:所有用于替代T的类型必须实现了IComparable接口。该约束也意味着,所有传入的类型实参都实现了CompareTo()函数,允许对该类型两个对象进行比较。
第二行定义了函数的返回值类型、函数名称以及形参,与普通函数定义类似,但有的类型用T来描述,它们将在运行时被确定。
二、使用类函数
调用类函数的方法与调用普通函数的方法一样。对上面声明的MaxElement()函数可如此调用:
array<double>^ data = {1.5, 3.5, 6.7, 4.2, 2.1};double maxData = MaxElement(data);
在这个例子中,编译器能够判断出该 类函数的类型实参为double,生成调用函数的代码(并非是该类函数的double版),执行时再用 double代替T。注意:与函数模板不同,对于类函数编译器不创建函数实例,而是仅仅是使编译后的代码可以接受数据类型作为类型实参,实际的类型替换在 运行时实现。
应该注意的是,如果以字符串常量作为实参传递给类函数,编译器将认为类型实参是String^,无论该字符串常量是窄字符串(“Hello”)还是宽字符串(L“Hello”)。
有些情况下,编译器无法根据函数调用来判断类型实参是什么,这时可用在函数名后面加尖括号和类型名称来显示的指定,上面的例子也可以写作
double maxData = MaxElement<double>(data);
另外需要注意的是,提供给类函数作为类型实参的不能是本地C++类类型、本地指针、引用,也不能是值类类型的句柄(如 int^)。而只能是值类型(如int、double)或引用类型的跟踪句柄(如String^)。
下面是一个使用类函数的完整示例。
// Ex6_10.cpp : main project file.// Defining and using generic fuctions#include "stdafx.h"using namespace System;// Generic function to find the maximum element in an arraygeneric<typename T> where T:IComparableT MaxElement(array<T>^ x){ T max = x[0]; for(int i=1; i<x->Length; i++) if(max->CompareTo(x[i])<0) max = x[i]; return max;}// Generic function to remove an element from an arraygeneric<typename T> where T:IComparablearray<T>^ RemoveElement(T element, array<T>^ data){ array<T>^ newData = gcnew array<T>(data->Length-1); int Index = 0; // Index to elements in newData array bool found = false; // Indicates that the element to remove from was found for each(T item in data) { // Check for invalid index or element found if((!found) && item->CompareTo(element)==0 ) { found = true; continue; } else { if(Index == newData->Length) { Console::WriteLine(L"Element to remove not found"); return data; } newData[Index++] = item; } } return newData;}// Generic function to list an arraygeneric<typename T> where T:IComparablevoid ListElements(array<T>^ data){ for each(T item in data) Console::Write(L"{0, 10}", item); Console::WriteLine();}int main(array<System::String ^> ^args){ array<double>^ data = {1.5, 3.5, 6.7, 4.2, 2.1}; Console::WriteLine(L"Array contains:"); ListElements(data); Console::WriteLine(L"\nMaximun element = {0}\n", MaxElement(data)); array<double>^ result = RemoveElement(MaxElement(data), data); Console::WriteLine(L"After removing maximun, array contains:"); ListElements(result); array<int>^ numbers = {3, 12, 7, 0, 10, 11}; Console::WriteLine(L"Array contains:"); ListElements(numbers); Console::WriteLine(L"\nMaximun element = {0}\n", MaxElement(numbers)); Console::WriteLine(L"After removing maximun, array contains:"); ListElements(RemoveElement(MaxElement(numbers), numbers)); array<String^>^ strings = {L"Many", L"hands", L"make", L"light", L"work"}; Console::WriteLine(L"Array contains:"); ListElements(strings); Console::WriteLine(L"\nMaximun element = {0}\n", MaxElement(strings)); Console::WriteLine(L"After removing maximun, array contains:"); ListElements(RemoveElement(MaxElement(strings), strings)); return 0;}
输出如下
Array contains: 1.5 3.5 6.7 4.2 2.1Maximun element = 6.7After removing maximun, array contains: 1.5 3.5 4.2 2.1Array contains: 3 12 7 0 10 11Maximun element = 12After removing maximun, array contains: 3 7 0 10 11Array contains: Many hands make light workMaximun element = workAfter removing maximun, array contains: Many hands make light
- C++/CLI(七):类函数
- C++/CLI学习入门(七):类函数(转)
- C++/CLI(六):函数
- C++/CLI的函数覆盖
- C++/CLI类函数重写规则的一些例子
- C++/CLI的静态构造函数
- c++Primer,七,函数
- C++/CLI ??
- c++/cli
- C++/CLI
- C++/CLI
- C++/CLI
- C++/CLI
- C++/CLI
- C语言(七)--函数
- 实例解析C++/CLI之静态构造函数
- C++/CLI思辨录之代理构造函数
- C++/CLI思辨录之拷贝构造函数
- CSDN博客频道——“我的2011”年度征文活动火爆进行中!
- C++/CLI(六):函数
- [W]和[V]的发音
- 二进制直接量(binary number format)
- Documents文件夹和Resources文件夹有什么样的区别?
- C++/CLI(七):类函数
- linux 后台运行和关闭SSH运行,查看后台任务
- 定时任务
- ssh 整合项目jar包 说明
- 通过CTS学习Android API系列1——CTS结果分析及用例研究
- C++/CLI(八):类的分类与定义
- 让Json更懂中文(JSON_UNESCAPED_UNICODE)
- 关于Socket编程的几篇博文
- 打造Android的中文Siri语音助手(二)——添加虫洞的开放API