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

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

下面就最后2條進行說明。

一、接收可變長度參數的函數

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

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

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

- - - - - - - - - - - - - - - - <<== 華麗的分割線 ::開始==>> [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;
}
- - - - - - - - - - - - - - - - <<== 華麗的分割線 ::結束==>> [Ex5_15.cpp] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

輸出為

42
49.5

二、main()的實參

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

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

- - - - - - - - - - - - - - - - <<== 華麗的分割線 ::開始==>> [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;
}
- - - - - - - - - - - - - - - - <<== 華麗的分割線 ::結束==>> [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