【问题标题】:In C++ what is the difference between *function(arguments..) and function(arguments)在 C++ 中,*function(arguments..) 和 function(arguments) 有什么区别?
【发布时间】:2015-08-10 01:58:24
【问题描述】:

我看到了以下类型的函数:

data_type *function_name(arguments...)

和:

data_type function_name(arguments...)

我正在尝试了解何时应该使用哪一个。为什么在下面的示例中这样做? (这是来自课程的教科书。)我什么时候应该编写这样的函数?

struct Tower
{
    string name;
    Tower *link;
};

Tower *createTower(string name, Tower *link);

有人可以进一步澄清这一点吗?

Tower* createTower(string name, Tower *link)
{
    Tower* tp = new Tower;
    tp->name = name;
    tp->link = link;
    return tp;
}

Tower* createBeconsOfGondor(){
    Tower *tp = createTower("Rohan", NULL); // Points to nothing
    tp = createTower("Halifiren", tp); // Still returns pointer?
}

createBeconsOfGondor()函数的第二行,那个函数的返回怎么还是一个指针?

【问题讨论】:

  • * 适用于它之前的事物(塔),而不是函数的名称。这个函数返回一个指向塔的指针。 (正如struct Tower 的第二个成员是一个指向 塔的指针。)
  • 一个返回指针,另一个不返回。
  • 谢谢,有道理。
  • 添加了后续问题

标签: c++ function pointers


【解决方案1】:

表示函数返回的是指针,而不是对象。

例如

Tower createTower(string name, Tower *link);

同时返回一个 Tower 对象

Tower *createTower(string name, Tower *link);

返回一个指向塔对象的指针。

【讨论】:

    【解决方案2】:

    函数Tower *createTower(string name, Tower *link); 返回一个指向Tower 对象的指针。函数名前面的星号只是指定返回类型是一个指针。

    你也可以用这种方式编写函数定义,这是等效的,但(在我看来)更清晰:

    Tower* createTower(string name, Tower* link);
    

    【讨论】:

    • 谢谢,这更清楚了。我现在明白,每当我想返回一个指向结构的指针时,这是有道理的。还有,这是一个函数指针吗?
    • 函数指针指向实际函数的内存地址,而不是像intstruct 这样的数据类型。例如,您可以定义Tower* (*func_ptr) (string, Tower*)。然后func_ptr 可以设置为任何以stringTower* 作为参数并返回Tower* 的函数的地址。所以你可以设置func_ptr = &createTower 然后你可以调用func_ptr(name, link)createTower 相同的代码将被执行。您可以根据不断变化的条件,使用函数指针根据需要换出函数代码。
    • 已编辑问题,扩展为提出后续问题。
    【解决方案3】:

    应该使用哪一个。

    注意第一种形式:

    Tower  createTower(...);
    

    可以用作赋值(从而延长实例的寿命),如

    ...
    Tower T1 = createTower(...);  
    ...
    

    或者,您可以用作匿名临时对象

     std::cout << createTower(...) << ...
    

    如果 Tower 很大,您可能有动力将昂贵的实例保留在打印持续时间之外......所以也许使用前者并这样做

    std::cout << T1 << ...
    

    否则,如果您担心堆栈空间,而不是担心记住不泄漏内存,那么您就有动力在堆中动态分配实例(这也支持长寿命)

     Tower* T1 = createTower(...);  // BIG tower in heap
    
     std::cout << *T1 << ....
    
     // .... and some time later, you should remember to 
    
     delete T1;
    

    其他人会建议您使用智能指针(并学习使用范围)来控制何时应该删除。


    总结:

    堆栈与堆与实例大小

    使用范围控制的寿命

    【讨论】:

    • 谢谢,这确实很清楚。我可以参考有关智能指针的良好参考吗?感谢您的帮助!
    【解决方案4】:

    Tower *createTower(string name, Tower *link); 当您在名为 createTower 的函数中返回一个塔(意味着一个结构)时使用它(这是一个将返回一个结构的函数指针)

    【讨论】:

    • 据我所知,这不是函数指针。等效的函数指针应该是 - Tower* (*createTower)(string name, Tower *link) 如果我错了,请纠正我
    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 2022-12-02
    • 2020-12-11
    • 1970-01-01
    • 2017-12-05
    • 2015-03-08
    • 2012-02-18
    • 2012-10-18
    相关资源
    最近更新 更多