我可以在Objective-C中以这种方式编写一个函数。这可以用来制作许多UIButtons。
+(UIButton*)getButton:(CGRect)frame{
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Some title" forState:UIControlStateNormal];
button.frame=frame;
return button;
}
可以用C ++完成吗?我不是要求在C ++中创建UIButton。
但是在这个函数的帮助下生成许多对象:
CString getCstring(some parameters)
{
CString string = L"Hi sampe string.";
return string;
}
我认为在此函数中创建的CString对象将在堆栈中,并且一旦离开此函数可能会丢失它的值。
对于Objective-C代码,我们可以保留自动释放的对象来使用它。 C ++中是否有这样的机制?
答案 0 :(得分:3)
在C ++中你可以做到
CString* getCString(some parameters)
{
CString* string = new CString(L"Hi sample string.");
return string;
}
并且如果你想在堆上放置字符串,则在完成调用后删除(通过在指针上调用delete)字符串。但是在你发布的第一个版本中,我认为没问题。它是一个堆栈变量,但当然它在调用者中仍然有效,因为它是返回值。
答案 1 :(得分:3)
我认为在这个函数中创建的CString对象将在堆栈中,并且一旦离开此函数就可能失去它。
它不会丢失它的值,因为它将被复制(尽管编译器可以将副本作为优化来删除)。
所以不要担心 - 这在C ++中运行得很好。
您还可以返回指向动态分配内存的指针,但由于客户端必须明确释放内存,因此这会使使用更加困难。一般来说,这不是一个好的解决方案 - 处理动态内存的原始指针是内存泄漏的首要原因,清理此类代码非常糟糕。
更好的方法是使用智能指针(例如shared_ptr
或unique_ptr
)来处理内存管理。
答案 2 :(得分:1)
您的string
变量最终会超出范围,但return string;
将仅返回副本,因此您现在可以在C ++中使用它...... < / p>
答案 3 :(得分:1)
您的Obj-C代码适用于编码样式和内存管理规则。它应该看起来像:
+(UIButton*)buttonWithFrame:(CGRect)aRect {
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Some title" forState:UIControlStateNormal];
button.frame = aRect;
return button;
}
看起来像是微小的变化,但它使记忆管理(对象所有权)变得明显,并且适当地命名参数。