在C ++中,* function(arguments ..)和function(arguments)之间有什么区别?

时间:2015-05-27 19:39:18

标签: c++ function pointers

我看到了类型的函数:

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

4 个答案:

答案 0 :(得分:1)

这意味着该函数返回一个指针,而不是一个对象。

例如

Tower createTower(string name, Tower *link);

时返回Tower对象
Tower *createTower(string name, Tower *link);

返回指向塔对象的指针。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

  

应该使用哪一个。

请注意第一种形式:

replace_code_in_c_file(filename, blockname, new_code)

可以用作赋值(从而扩展实例的生命),如

Tower  createTower(...);

或者,您可以将其用作匿名临时

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

如果塔是大的,你可能有动力保持昂贵的实例不仅仅是打印持续时间...所以也许使用前者并做

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

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

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

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

摘要:

堆栈vs堆与实例的大小

使用范围控制的生命周期

答案 3 :(得分:-1)

Tower * createTower(字符串名称,Tower *链接); 当你在你的功能中返回一个塔(意味着一个结构)时使用这个命名为createTower(这是一个将返回一个结构的功能指针)