C++/CLI中函數(shù)的工作方式與ISO/ANSI C++完全相同,但由于在C++/CLI中用跟蹤句柄和跟蹤引用替代了本地指針和引用,因此也帶來一些變化,主要包括

  • CLR程序中函數(shù)的形參與返回值可以是數(shù)值類型、跟蹤句柄、跟蹤引用和內(nèi)部指針。
  • 如果某個形參是CLR數(shù)組,程序不需要另外的參數(shù)指定其大小,因?yàn)閿?shù)組大小在屬性Length中。
  • 在C++/CLI程序中,不能像C++一樣進(jìn)行地址的算術(shù)運(yùn)算,而應(yīng)使用數(shù)組索引。(內(nèi)部指針不是可以算術(shù)操作嗎?
  • 可以方便的返回CLR堆上的句柄,因?yàn)镃LR有垃圾回收機(jī)制自動清理無用的內(nèi)存。
  • C++/CLI函數(shù)接收可變長度參數(shù)的機(jī)制與本地C++不同。
  • C++/CLI中main()函數(shù)訪問命令行實(shí)參的機(jī)制與本地C++不同。

下面就最后2條進(jìn)行說明。

一、接收可變長度參數(shù)的函數(shù)

C++/CLI允許將形參列表指定為數(shù)組,數(shù)組聲明前面加省略號,從而實(shí)現(xiàn)實(shí)參的長度可變。

int sum(...array<int>^ args)
{
	// Code for sum
}

上面的sum()函數(shù)可以接收任意數(shù)量的整數(shù)作為實(shí)參,在函數(shù)內(nèi)部,通過訪問數(shù)組args的元素就可以實(shí)現(xiàn)對實(shí)參的處理,實(shí)參個數(shù)由args的屬性Length得到。下面是一個完整的例子,描述了該機(jī)制的工作過程。

- - - - - - - - - - - - - - - - <<== 華麗的分割線 ::開始==>> [Ex5_15.cpp] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Ex5_15.cpp : main project file.
#include "stdafx.h"
using namespace System;

double sum(...array<double>^ args)
{
	double sum = 0.0;
	for each(double arg in args)
		sum += arg;
	return sum;
}

int main(array<System::String ^> ^args)
{
	Console::WriteLine( sum(2.0, 4.0, 6.0, 8.0, 10.0, 12.0) );
	Console::WriteLine( sum(1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9) );
        return 0;
}
- - - - - - - - - - - - - - - - <<== 華麗的分割線 ::結(jié)束==>> [Ex5_15.cpp] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

輸出為

42
49.5

二、main()的實(shí)參

從前面的例子可以看出,CLR程序中main()函數(shù)僅有一個形參,它為String^類型的數(shù)組,這就將處理命令行實(shí)參簡化為訪問該數(shù)組的元素。下面的例子展示了這個用法。

此外還應(yīng)注意:與本地C++中main()不同,命令行參數(shù)中不包括程序名稱本身。

- - - - - - - - - - - - - - - - <<== 華麗的分割線 ::開始==>> [Ex5_16.cpp] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Ex5_16.cpp : main project file.
#include "stdafx.h"
using namespace System;

int main(array<System::String ^> ^args)
{
	Console::WriteLine(L"There were {0} command line arguments.", args->Length);
	Console::WriteLine(L"Command line arguments received are:");
	int i=1;
	for each(String^ str in args)
		Console::WriteLine(L"Argument {0}: {1}", i++, str);
    
	return 0;
}
- - - - - - - - - - - - - - - - <<== 華麗的分割線 ::結(jié)束==>> [Ex5_16.cpp] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
輸出為
D:\My Documents\My Projects\Ex5_16\Debug>ex5_16 tring multiple "arguments values
" 4.5 0.0
There were 5 command line arguments.
Command line arguments received are:
Argument 1: tring
Argument 2: multiple
Argument 3: arguments values
Argument 4: 4.5
Argument 5: 0.0