我看到了类型的函数:
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()函数的第二行,该函数的返回如何仍然是一个指针?
答案 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(这是一个将返回一个结构的功能指针)