【问题标题】:In what manner are the functions called in this C++ code?此 C++ 代码中以何种方式调用函数?
【发布时间】:2012-08-12 05:15:36
【问题描述】:

我从 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

我不明白的是“输入姓氏:”是如何以及为什么执行了两次,为什么char * getname()函数在int main()之前执行,以及这两个函数是如何相互作用的。

【问题讨论】:

  • 多么可怕的程序。你在用什么书?
  • 你不是在阅读那些业余的、不完整的维基书籍之一吗?
  • main 呼叫getname 两次,这就是“输入姓氏”显示两次的原因。
  • 是的,看来你是从错误的脚开始学习 C++,买好东西或寻找优质的免费材料:mindview.net/Books/TICPP/ThinkingInCPP2e.html
  • @第一个两位评论员:Addison Wesley 的 C++ Primer Plus 第 6 版。另外,是的,代码非常奢侈。此外,令人遗憾的是,这本书是业余的。 @Giovanni Azua:我稍后会去 ebay 大礼包,并在我的列表中添加一本更好的书(当然,我会研究哪些书是好书和坏书)。感谢您的提醒。

标签: c++ function


【解决方案1】:

“输入姓氏”被打印了两次,因为它被打印在 getname() 中并且getname() 被调用了两次。

getname()int main() 之前执行,它被声明了。必须声明它,以便编译器在编译main()(使用getname())时,编译器知道要做什么。

main() 是第一段可执行代码(开发人员通常可以对其施加影响,但也有例外)。程序中发生的所有事情都是因为 main() 做到了,或者 main() 调用(直接或间接)做到了。在您的示例中,main() 将:执行以下操作:

  1. 调用 getname()
  2. 根据 getname() 的返回打印一些内容
  3. 释放在 getname() 中分配的资源
  4. 调用 getname()
  5. 根据 getname() 的返回打印一些内容
  6. 释放在 getname() 中分配的资源

【讨论】:

  • "return" 是一个奇怪的单词选择,因为它在 C++ 中的其他含义。可能是“解除分配”或“破坏”?
  • 所以,我猜它就像 Python 中的 def name(): system。在 int main() 之后声明 getname() 很奇怪,如果不这样做,编译器会发出警告。无论如何,谢谢你的解释!我曾认为它们是独立的功能。 getname() 作为 int main() 的组成部分更有意义。
  • @ThroatOfWinter57 - getname()main 之前声明,位于标记为“函数原型”的行上。它在main 之后定义。有些人喜欢以这种方式编写代码,以便在深入了解getname() 的细节之前先在 main 中获得概述。其他人(包括我)反其道而行之,将getname() 的定义放在main 之前,并删除原型,如果先定义则不需要。它们是独立的功能。 getname() 是从 main() 调用的,但它不是它的一部分。
  • @Pete Becker - 很高兴听到,我以后会使用你的后一种方法;前者对我来说很奇怪。
猜你喜欢
  • 1970-01-01
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多