2012-08-15 22 views
0

我從C++入門書中得到了這段代碼,這本書是爲了解釋刪除操作符。但是,我不明白的是程序如何調用這兩個函數以及它們如何相互作用。在這個C++代碼中調用的函數是什麼方式?

// delete.cpp -- using the delete operator 
#include <iostream> 
#include <cstring> // or string.h 
using namespace std; 
char * getname(void); // function prototype 

int main() 
{ 
    char * name; // create pointer but no storage 

    name = getname(); // assign address of string to name 
    cout << name << " at " << (int *) name << "\n"; 
    delete [] name; // memory freed 

    name = getname(); // reuse freed memory 
    cout << name << " at " << (int *) name << "\n"; 
    delete [] name; // memory freed again 

    return 0; 
} 

char * getname() // return pointer to new string 
{ 
    char temp[80]; // temporary storage 
    cout << "Enter last name: "; 
    cin >> temp; 

    char * pn = new char[strlen(temp) + 1]; 
    strcpy(pn, temp); // copy string into smaller space 

    return pn; // temp lost when function ends 
} 

這本書提供了以下運行示例:

Enter last name: Fredeldumpkin 
Fredeldumpkin at 0x004326b8 
Enter last name: Pook 
Pook at 0x004301c8 

我不明白的是如何以及爲什麼「輸入名字:」被執行了兩次,爲什麼字符*的getName()函數在int main()之前被執行,以及這兩個函數是如何相互作用的。

+4

多麼可怕的程序。你在用什麼書? – 2012-08-15 21:06:31

+0

你不是在閱讀那些業餘不完整的維基書籍嗎? – ApprenticeHacker 2012-08-15 21:08:32

+3

'main'兩次調用'getname',這就是爲什麼「輸入姓氏」顯示兩次。 – birryree 2012-08-15 21:09:07

回答

5

「輸入姓氏」被打印兩次,因爲它被打印在getname()getname()被調用兩次。

getname()不是int main()之前執行,它被聲明。必須聲明它,以便當編譯器編譯main()(使用getname())時,編譯器知道要做什麼。

main()是第一塊可執行代碼(開發人員通常具有影響力,但也有例外)。在你的程序中發生的一切都是因爲main()這樣做,或者main()調用(直接或間接)調用它。在您的樣品,main()會:請執行下列操作:

  1. 則調用GetName()
  2. 打印一些基於的getName()被分配中的getName()
  3. 呼叫
  4. 釋放資源的回報的getName()
  5. 基於被分配裏面的getName()
012說的getName()
  • 釋放資源的回報打印的東西
  • +0

    「* return *」是單詞的奇怪選擇,因爲它在C++中有其他含義。 「解除分配」或「破壞」也許? – 2012-08-15 21:14:32

    +0

    好點;我已將術語修改爲'release'。 – mah 2012-08-15 21:15:47

    +0

    所以,我想它就像Python中的def name():system一樣。在int main()之後聲明getname()是很奇怪的,如果你不這樣做,你會從編譯器得到警告。無論如何,謝謝你的解釋!我曾認爲它們是獨立的功能。作爲int main()的一個組成部分的getname()更有意義。 – Stumbleine75 2012-08-15 21:25:02

    相關問題