你可以給我一個例子,當我不能通過引用傳遞參數,我需要使用指針。我找到了一個例子,但我不確定。當我需要通過指針傳遞(而不是通過引用)
假設您有一個來自基類B
的類D
。如果你想這樣做,你需要有一個指針:
void function(B* b){...}
int main{
D* d;
function(d);
}
你可以給我一個例子,當我不能通過引用傳遞參數,我需要使用指針。我找到了一個例子,但我不確定。當我需要通過指針傳遞(而不是通過引用)
假設您有一個來自基類B
的類D
。如果你想這樣做,你需要有一個指針:
void function(B* b){...}
int main{
D* d;
function(d);
}
單時,你不能使用參考,並必須使用指針,如果你允許「不爭論」的概念,通過傳遞一個空指針。
但是,當您實際存儲指向任何傳遞的指針時,您可能希望使用指針作爲參數。大多數C++開發人員都會注意到你沒有使用引用,並且特別注意你的文檔所說的內容。
有人可能會爭辯說,你甚至不需要*需要*一個指針,如果你寫一個具有可空狀態的對象。但無論如何。 – 2010-10-14 21:40:42
是的,但並非所有的對象都是可空的,特別是當你使用RAII時:-) – 2010-10-14 23:16:52
@John Dibling:我不是Nullable概念的粉絲(至少內置),我更喜歡'boost :: optional '鉤子,以便按類型區分什麼可以和不能爲空。 – 2010-10-15 07:10:29
唯一的原因是如果你需要傳遞null。也就是說,你想調用這個函數說'我還沒有其中一個'
如果有一個編碼指南(如谷歌的)說使用指針參數,那麼這就是你所做的。
否則,只能用指針形參聲明自己的功能時
一個空指針是一個有效的&有意義的實際參數,或
實際參數是最自然的指針已經或
你打算將指針存儲在某處。
可能更多的情況,但我認爲你漂移:當你有一個選擇(無編碼準則另有說法),喜歡引用。
乾杯&心連心,
如果你想允許缺乏一個對象,你需要使用指針:
// This allows DoSomething to receive pointers to NULL, which cannot
// be done with references
void DoSomething(Something *pSomething)
{
if (pSomething)
{
...
}
}
int main()
{
Something *pSomething=NULL;
DoSomething(pSomething);
}
而不是一個函數長的if語句,請考慮if(!pSomething){return; }頂部:) – 2010-10-15 07:12:10
@Matthieu:但是然後該函數將有多個退出! ....:P – GManNickG 2010-10-15 21:38:23
http://www.daniweb.com/forums/thread216353.html
單鏈表例子是指針和指針的指針被用作函數參數。
我認爲如果你想傳遞一個函數,你必須通過指針傳遞它。我不明白你如何通過引用來傳遞函數。
例如,採取以下功能:
#include <iostream>
#include "math.h"
void myfun (double value, size_t nofloops, double (*function)(double))
{
std::cout << value << std::endl;
for (size_t i=0;i<nofloops;++i)
{
value = function(value);
std::cout << value << std::endl;
}
std::cout << "------------------" << std::endl;
}
void main()
{
myfun(100,10,sin);
myfun(100,10,cos);
myfun(100,10,sqrt);
}
在這個小效用函數執行給定的功能的次數,取該結果作爲下一次迭代的輸入。我看不出你如何通過引用來傳遞函數。
-1 for'void main',在C和C++中都是無效的(並且在任何一種語言中都是無效的).Re傳遞引用:只需用'(* function) &功能)'。而已。 :-)乾杯&hth。, – 2010-10-15 05:10:15
PS:當你通過引用傳遞一個函數時,你會得到一個非常奇怪的野獸(這可能是你認爲它無法完成的原因),一個*只讀引用*。它不是對const的引用,但是你不能指定它。因爲你不能分配給一個函數,並且當你把一個引用看作一個別名,另一個名字,那麼這是有道理的。 – 2010-10-15 05:15:18
顯然,一些較早的C編譯器允許「void main」。請參閱http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/legality-of-void-main.html。 – Patrick 2010-10-15 07:01:49
另一種情況:如果你傳遞的東西是可變參數之前的最後一個參數:
void fn1(A &a, ...); // Uh oh
void fn2(A *a, ...); // Good
如果這是標準所要求的,我不知道,或者僅僅是在執行中的錯誤我使用的C++編譯器。
該標準只說變量參數必須是最後一個參數,或者可能必須有一個前面的參數。該參數的類型絕對沒有提及。 – Puppy 2010-10-15 21:50:29
在聲明或定義一個函數方面,不需要'...'之前的POD類型,但需要使用'va_start()'返回有用的參數。 18.7p3:「如果使用函數,數組或引用類型聲明[va_start]參數,或者使用與傳遞沒有參數的參數傳遞的類型不兼容的類型,行爲是不確定的。「 – aschepler 2010-10-15 22:03:54
此外,在這種情況下,我建議創建一個從'class A'到一個包含'A *'指針的POD結構的隱式轉換,並將其作爲最後一個命名參數,以便用戶可以調用該函數第一個參數類型實際上是'A'(或相關的參考)。 – aschepler 2010-10-15 22:06:54
通常,使用指針的兩兩件事之一:
如果您的預期用例不需要這兩個屬性中的任何一個,請使用引用。否則,使用指針。
您可以在示例中使用參考。 – JoshD 2010-10-14 21:02:04
我剛纔問同樣的問題http://stackoverflow.com/questions/3835741/are-reference-and-pointer-equal-with-regards-to-polymorphism – pm100 2010-10-14 21:03:54