首先,形參大致可以分爲三種:非引用形參、引用形參和指針類型形參。
一、非引用形參
在傳遞參數的時候,不論是所謂的傳值還是傳址,實際上都是實參值到形參值的複製,其中的區別只是複製的是普通對象還是引用對象而已。對於非引用形參,通過參數傳遞之後,形參是實參的一個副本,而非引用形參使得複製後形參與實參並沒有任何關聯,因此,在函數中對形參的任何操作將不會影響到實參的值,因此,不論實參是變量還是常量,形參的操作是基於副本的,將不受任何的限制。如下例子:
void func1(int num)
{
int value1 = num;
}
void func2(const int num) //const形參
{
int value1 = num;
}
void main()
{
int num1 = 1;
const int num2 = 2;
func1(num1);
func1(num2); //ok,將const對象傳遞給非const形參
func2(num1);
func2(num2);
這裏,儘管實參是const常量,仍然可以傳遞給非const形參,因爲形參操作的是實參的副本,並不直接訪問const實參,因此,不論實參是不是const常量都與形參無關了。
對於編譯器,儘管func2的形參是const,但是編譯器將func2的定義視爲其形參被聲明爲普通的int一樣。
二、對於引用形參
<span style="font-size:14px;">void func1(int &num)
{
int value1 = num;
}
void func2(const int &num) //const引用形參
{
int value1 = num;
}
void main()
{
int num1 = 1;
const int num2 = 2;
func1(num2); //error,不能將const對象傳遞給非const形參</span>
上面的func1函數的形參是const,這使得在func1函數中能夠自由訪問形參的值,如果傳遞的實參爲const,則會錯誤訪問const對象。錯誤提示如下: