我实际上正在处理指向用户定义对象的指针,但为了简单起见,我将使用整数来演示这种情况。
int* f(){
return new int(5);
}
void f2(int* i){
*i = 10;
}
int main(){
int* a;
int* b = new int();
a = f();
f2(b);
std::cout << *a << std::endl; // 5
std::cout << *b << std::endl; // 10
delete b;
delete a;
return 0;
}
考虑在函数f()
和f2()
中有一些更复杂的计算,它们确定要返回的指针的值(f()
)或通过参数更新({{1} })。
由于它们都有效,我想知道是否有理由选择其中一种?
答案 0 :(得分:1)
通过查看玩具代码,我的第一个想法是将f / f2代码放入实际对象的构造函数中,并完全取消自由函数。但假设这不是一个选项,它主要是的风格/偏好问题。以下是一些注意事项:
第一个更容易阅读(在我看来)因为很明显指针是一个输出值。当您将(非对象)指针作为参数传递时,很难一目了然地判断它是输入,输出还是两者。
首选的另一个原因是,如果您订阅了思想学校,那么就应该尽可能使对象变为不可变,以便简化代码的推理并排除线程安全问题。如果你正在尝试,那么唯一真正的选择是f()创建对象,配置它,并返回const Foo*
(再次,假设你不能只是将代码移动到构造函数)。 / p>
首选的一个原因是它允许您配置在别处创建的对象,并且对象可以是动态的也可以是自动的。虽然这可能实际上是反对这一方法取决于上下文 - 有时最好知道某个类型的对象将始终在一个位置创建和初始化。
答案 1 :(得分:0)
如果分配函数f()
与new相同,那么只需调用new。你可以在对象的构造中做任何初始化。
作为一般规则,尽可能避免传递原始指针。但是,如果对象必须比创建它的函数更长,那么这可能是不可能的。
对于一个简单的案例,就像你所展示的那样,你可能会做这样的事情。
void DoStuff(MyObj &obj)
{
// whatever
}
int Func()
{
MyObj o(someVal);
DoStuff(o);
// etc
}
答案 2 :(得分:0)
f2
更好只是因为int
的所有权非常明确,并且因为您可以根据需要分配它。这个理由足以挑选它。