關於函式的引數為類的引用時編譯錯誤的分析

2021-06-21 11:01:47 字數 1581 閱讀 5759

關於函式的引數為類的引用的分析

下面這段程式是過載「+

」,使之實現兩個複數的相加,並且利用了轉換建構函式,可以將實數轉換成複數類,程式如下:

#include

using namespace std;

class complex

complex(double r)

complex(double r,double i)

friend complex operator + (

complex &c1,complex &c2

); //

改為(complexc1,complex c2)

程式正確

void display();

private:

double real;

double imag;};

complexoperator + (

complex &c1,complex &c2

) //

改為(complexc1,complex c2)

程式正確

voidcomplex::display()

intmain()

這是乙個錯誤的程式,編譯不能通過,錯在「+

」過載函式用了

「類的引用呼叫

」,如果不用

「類的引用呼叫

」,改用

「實參傳遞形參

」,程式正確。為什麼這裡不能用

「類的引用呼叫

」呢??

在利用轉換建構函式來實現複數和整型值相加的時候,我也遇到了上面最開始的問題。上面的內容是我在網上查詢資料時

copy

下來的。後來,我又自己翻閱了譚浩強編的

c++,找到了比較清楚的解釋。

書中在介紹引用時強調,可以用常量或表示式對引用進行初始化,但此時必須用

const

作宣告。

為什麼一定要用

const

作宣告?這是我的最先有的乙個疑問,想必你也是的。下面分析。

引用,一般地來講是不能被初始化的。為什麼

如果你一定要給引用初始化,可以,但必須用

const

了。為什麼?

2.5傳給引用,編譯器首先時在內部生成了乙個臨時變數,然後通過臨時變數再賦給引用。**表示下:

double temp = 2.5;

complex &c2 =temp;

這裡就涉及到了我們問題的關鍵所在了。改變引用的

c2值,同樣會改變

temp

的值,但是,

2.5的值卻不能被修改。我們把引用作為形參,如果改變引用的值,是希望同時能夠改變傳遞的實參的值的。這就與我們上面例子分析的結果產生了矛盾。與其允許修改引用的值而不能滿足使用者的需要,還不如不允許修改,這就是

c++對這類引用必須要加

const

的原因。了解了我前面提到的

2個為什麼,相信你就能明白了。

那麼最初遇到的問題,根據上面的分析便很容易解決了。要麼,我們不用引用,就用傳值的方式,要麼,我們在使用引用時,用

const

加以限定。如果你用了引用,又沒加

const

,很不幸

python 類 函式的引用

類的引用 一 同級目錄引用 from 檔名 import 類名 如果報錯,原因基本上就是 pycharm不會將當前檔案目錄自動加入自己的sourse path。解決方法 右鍵make directory as sources root將當前工作的資料夾加入source path就可以了。models...

C C 函式呼叫時的引數傳遞小結

眾所周知 void method object arg 和void method object arg 的區別,前者 在函式呼叫的時候,將實參進行了乙個複製,複製了乙個映象給了method函式,不管在method中如何改變arg的值,之前的實參一直都沒有變化,自始自終都固定不變。而後者 則是將實參本...

C 中函式呼叫時的指標和引用

在函式呼叫時,用指標或者引用做引數,表示把變數的位址傳遞給子函式,但是子函式只能修改指標所指變數的值,並不能修改指標的指向。如果想用修改指標的指向,就要用指標的指標,或者指標的引用。大部分情況下,用指標和引用做引數,只是想要修改指標所指變數的值,並沒有想修改指標的指向。但是如果指標所指的這塊內存在呼...