我想制定将参数传递给函数/方法的约定。我知道这是一个常见的问题,并且已经回答了很多次,但是我搜索了很多,没有找到任何让我完全满意的东西。
值传递很明显,我就不提了。我想到的是:
- 通过非常量引用 意味着该对象是MODIFIED
- 通过const 引用 意味着该对象是USED
- 通过指针 传递意味着对对象的引用将被存储。是否传递所有权取决于上下文。
它似乎是一致的,但是当我想选择堆分配的对象并将其传递给 2.case 参数时,它看起来像这样:
void use(const Object &object) { ... }
//...
Object *obj = getOrCreateObject();
use(*obj);
或
Object &obj = *getOrCreateObject();
use(obj);
我觉得两者都很奇怪。你有什么建议?
PS 我知道应该避免使用原始指针并使用 smart(更容易的内存管理和所有权表达),这可能是重构我从事的项目的下一步。
最佳答案
如果您愿意,可以使用这些约定。但请记住,在处理其他人编写的代码时,您不能假定约定。您也不能假设阅读您的代码的人知道您的约定。当接口(interface)可能不明确时,您应该用注释记录接口(interface)。
Passing by pointer means, that object is going to be STORED. Who's its owner will depend on the context.
我只能想到一个指针参数的所有权应该转移给被调用者的上下文:智能指针的构造函数。
除了可能的存储意图外,指针参数还可以与引用参数具有相同的含义,此外参数是可选的。您通常不能用引用来表示可选参数,因为它们不能为 null - 尽管对于自定义类型,您可以使用对标记值的引用。
Both look weird to me. What would you advise?
在我看来都不奇怪,所以我的建议是习惯。
关于关于传递对象的 C++ 约定(指针与引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49475680/