在c++中,*function(arguments.)和function(arguments.)的区别是什么?

In C++ what is the difference between *function(arguments..) and function(arguments)

本文关键字:arguments function 区别 是什么 c++      更新时间:2023-10-16

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

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()函数的第二行,该函数的返回值如何仍然是一个指针?

表示该函数返回一个指针,而不是一个对象。

例如

Tower createTower(string name, Tower *link);

返回一个Tower对象,而

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

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

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

你也可以这样写函数定义,这是等价的,但(在我看来)更清楚:

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

应该使用哪一个

注意第一种形式:

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;

其他人会建议你使用智能指针(并学会使用作用域)来控制何时应该删除。


概要:

堆栈vs堆vs实例大小

使用范围控制的生命周期

Tower *createTower(string name, Tower *link);当你在createTower函数(这是一个函数指针,它将返回一个结构)中返回一个塔(意味着一个结构)