2012-03-25 25 views
3
class SimpleCat 
{ 
public: 
    SimpleCat(); 
    SimpleCat(SimpleCat&); 
    ~SimpleCat(); 
}; 

SimpleCat::SimpleCat() 
{ 
    cout << "Simple Cat Constructor.. \n"; 
} 

SimpleCat::SimpleCat(SimpleCat&) 
{ 
    cout << "Simple Cat Copy Constructor ..\n"; 
} 

SimpleCat::~SimpleCat() 
{ 
    cout << "Simple Cat Destructor! ... \n"; 
} 

SimpleCat *FunctionTwo(SimpleCat *theCat); 

void main() 
{ 
    cout << "Making a cat ...\n"; 
    SimpleCat Frisky; 
    cout << "Calling FunctionTwo ..\n"; 
    FunctionTwo(&Frisky); 
    system("pause"); 
} 

SimpleCat *FunctionTwo (SimpleCat *theCat) 
{ 
    cout << "FunctionTwo, Returning... \n"; 
    return theCat; 
} 

好吧,所以我不明白的是,爲什麼你需要* FunctionTwo?如果你真的想幫我一個忙,有人可以爲我分解代碼(指針部分,因爲我嚴重不明白何時以及爲什麼要使用*&我不明白關於指針的這一課

+0

+1簡單貓拆解器! – 2012-03-25 00:56:38

+2

你會說......你需要一些指針嗎? – 2012-03-25 00:59:06

+0

http://stackoverflow.com/questions/9636903/what-are-the-distinctions-between-the-various-symbols-etc-combined-with-p/9637342#9637342 – bames53 2012-03-25 01:03:59

回答

1

FunctionTwo返回一個指向一個SimpleCat對象,你可以看到,它也接受一個指向SimpleCat對象的指針作爲參數,它只是接受指針,然後在這種情況下返回它

要調用這個函數,你需要傳遞一個指向它如果你想傳遞Frisky到函數,你需要傳遞Frisky對象的地址,這就是在寫入& Frisky時所要做的事情,用Frisky對象的地址創建一個指針,

但是,當類似的聲明寫在一個函數的參數列表,即SomeFunction(SimpleCat &嬉鬧)它告訴你的是,對象是由參考傳遞給函數。這基本上允許你使用指針的優點之一,而不用擔心指針語法。您可以通過說SomeFunction(Frisky)來正常調用該函數,並且在該函數中您將使用與主函數中相同語法的Frisky,但應該記住該對象不會被複制。在主函數和SomeFunction函數內,您都在完全相同的對象上執行操作。它不會被複制。只有訪問Frisky所需的信息纔會被賦予該功能。

+0

非常感謝,現在完全有道理:D – 2012-03-25 00:56:43

+0

在C++中使用指針和引用有許多微妙之處。我建議你做一些額外的閱讀,以確保你瞭解所有不同的情況,以及爲什麼你應該在某種情況下使用一種方法而不是另一種方法。祝你好運。 – ShiggityShiggityShwa 2012-03-25 00:58:41

0

好的。這很容易。指針是一個操作,指向內存中的某個空間。所以說你已經在內存中爲你的類的一個實例分配了一個地方,並且一個指針允許你引用這個空間的起始點。就你所知道的是位於這塊內存中的實例的類定義,你可以使用該類的所有方法和字段。 下面的鏈接可以幫助你處理它 What are the differences between a pointer variable and a reference variable in C++? 是的,你的函數只是返回一個SimpleCat *類型的值,它是一個指向SimpleCat結構的指針。

0

確定通過看主,讓我們開始:

void main() 
{ 
    cout << "Making a cat ...\n"; 
    SimpleCat Frisky; 
    cout << "Calling FunctionTwo ..\n"; 
    FunctionTwo(&Frisky); 
    system("pause"); 
} 

這裏唯一的事情,可能無法使用FuctionTwo(&Frisky)任何意義給你。這是做什麼是通過Frisky地址FucntionTwo()。當&被放置在任何類型的變量前面時,它只是意味着抓住這個變量的地址。

現在讓我們來看看FunctionTwo()

SimpleCat *FunctionTwo (SimpleCat *theCat) 
{ 
    cout << "FunctionTwo, Returning... \n"; 
    return theCat; 
} 

FunctionTwo需要的SimpleCat的指針。在這種情況下,SimpleCat已被定義爲您在上面定義的類的結構。 *的含義是,無論何時使用變量theCat,您都在處理傳遞給函數的任何地址。這就是爲什麼你需要取消引用Frisky之前將它傳遞給函數。該函數正在查找正在傳遞的任何地址。

最後您看到FunctionTwo正在返回變量theCat。由於它作爲指針傳入,因此需要將其作爲指針返回。這就是爲什麼函數被刪除爲SimpleCat *FunctionTwo(),這是準備一個事件的代碼,其中返回類型不是一個完整的值,而是一個帶有值的變量的引用。

這是你在哪裏得到的概念通過引用通過價值