我有两个函数接受指针作为参数,其中一个函数内部包含使用其输入参数调用另一个函数,例如。
foo(int* x)
{
//...
}
goo(int* y)
{
//...
foo(y) ; // I don't like this line, would prefer something like foo(&y)
}
现在,我想首先使用指针的原因是,当我调用函数时,很容易看到它的参数可能被它修改,即
foo(&xyz)
而不是
foo(xyz) // this looks like foo() accepts a copy, not actual variable
但现在当我从foo()
拨打goo()
时,我失去了这个视觉线索。在论证前面,因为goo()
中的y是int*
类型,或foo()
所期望的,所以我不能写foo(&y)
。而且我想知道是否有任何方法可以通过调用foo()
goo()
foo()
{{1}}不接受副本,但实际变量,以及它能够永久改变发送给它的arguent。
嗯,我希望我听起来不会太混乱:|
答案 0 :(得分:1)
在我看来,你想要避免引用让你错过了一件事:你的函数的x
和y
参数现在是指针。这意味着foo(y)根本不会修改y
(实际上它不能,因为它的参数是y
的副本)。它会修改 y
所指向的值。
我猜你试图找到一个等同于C#的显式ref
修饰符,但C ++中没有一个。我知道有些人试图用指针来模拟这种行为,但正如你自己所见,这是行不通的,因为指针的语义是不同的。实际上,指针实际上会使事情变得更加不安全,因为你可能会意外地直接修改它们的地址(而不是它们的引用值),这就是为什么我认为你不应该使用它们,除非你真的需要,好吧,指针。
是的,C ++隐式传递引用可能看起来令某些人感到不安,但这就是它的工作方式,并且它贯穿于C ++的设计:明显的厌恶是明确的和冗长的。请注意,这不仅仅是受此约束的引用:更重要的是,这是参数的常量。您没有明确指定参数必须是const还是非const。您甚至不确定是否调用成员函数的const或非const版本。这没关系,因为您应该能够使用intellisense检查函数声明,或者使用热键跳转到声明。
答案 1 :(得分:0)
你可以说:
foo( & (*y) );
但请不要。只是学会更好地阅读代码。
答案 2 :(得分:0)
为什么不使用引用?
foo(int& x)
{
//...
}
goo(int& y)
{
//...
foo(y);
}
它不会使意图更加清晰。
答案 3 :(得分:0)
它与您的问题略有不同,但您可能需要查看const正确性(here或here)。
在计算机科学中,const-correctness是程序正确性的形式,它处理对象的正确声明为可变或不可变。
虽然它不会立即明显,但您应该能够通过查看函数定义而不是深入检查函数来判断是否将修改参数。另外,我假设开发人员也会尊重约定,而不是丢弃const等等(参见上面的第二个链接)。
答案 4 :(得分:0)
这是不可能的。我看到的唯一方法是发表评论(简单明了):
goo(int* y)
{
//...
foo(y) ; // foo receives pointer y and its content can be modified
}
答案 5 :(得分:0)
foo(xyz) // this looks like foo() accepts a copy, not actual variable
更多地使用参考。多使用const。然后,在没有上下文的情况下,该片段将看起来像foo
可能会修改 xyz
。或者在上下文中,您将看到它复制/可变引用/常量引用xyz
(适当删除)。
指针用于可能不存在的东西(在其他地方)
您的使用情况现在具有更多可以跟踪其更改的内容。首先是指向的值,然后是 pointer 的值,因此可能会与其他 pointing-to 的值无界。