2012-08-15 43 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