我想制定关于将参数传递给函数/方法的约定。我知道这是一个常见的问题而且它已被多次回答,但我搜索了很多,并没有发现任何完全满足我的东西。
价值传递是显而易见的,我不会提到这一点。我想出的是:
它似乎是一致的,但是当我想选择堆分配的对象并将其传递给2. case参数时,它看起来像这样:
void use(const Object &object) { ... }
//...
Object *obj = getOrCreateObject();
use(*obj);
或
Object &obj = *getOrCreateObject();
use(obj);
我看起来都很奇怪。你会提出什么建议?
PS我知道应该避免使用原始指针并使用智能(更简单的内存管理和所有权表达),这可能是重构我工作项目的下一步。
答案 0 :(得分:1)
如果您愿意,可以使用这些约定。但请记住,在处理其他人编写的代码时,您不能采用约定。您也不能假设阅读代码的人知道您的约定。当条件可能不明确时,您应该记录带有注释的界面。
通过指针传递意味着该对象将被存储。谁的拥有者将取决于具体情况。
我只能想到一个指针参数的所有权应该传递给被调用者的上下文:智能指针的构造函数。
除了可能的存储意图之外,指针参数可以替代地具有与引用参数相同的含义,并且参数是可选的。您通常不能使用引用表示可选参数,因为它们不能为null - 尽管使用自定义类型您可以使用对sentinel值的引用。
我看起来都很奇怪。你会提出什么建议?
对我来说都不奇怪,所以我的建议是习惯了。
答案 1 :(得分:0)
在我的观点中,它们是相同的。在帖子的第一部分,您正在谈论签名,但您的示例是关于函数调用。
答案 2 :(得分:0)
您的约定的主要问题是您不会考虑与代码接口的可能性(例如,由其他人编写),但不遵守您的惯例。
一般来说,我使用一组不同的约定,很少发现需要解决它们。 (主要的例外是如果需要使用指针指针,但我很少需要直接这样做。)
如果以下任何一项可能属实,则通过非const
引用是合适的;
const
引用传递给另一个函数[与选择省略const
的开发人员使用第三方代码时相关 - 这实际上是许多初学者或懒惰的开发人员做的;; const
指针传递给另一个函数[当使用第三方代码时相关的是选择省略const
的开发人员,或使用旧版API时); const
成员函数(无论它们是否更改对象)[通常考虑使用第三方代码时,开发人员希望避免使用{{1} }]。相反,如果满足以下所有条件,则可以传递const
个引用;
const
成员; mutable
引用,const
指针或值传递给其他函数; const
个成员函数(即使这些成员能够更改const
个成员。在函数复制对象的情况下,我将按值而不是mutable
引用传递。 (例如,我不会通过const
引用,然后在函数中构造传递对象的副本。)
传递非const
指针是相关的,如果它适合传递非const
引用,但也有可能不传递任何对象(例如const
)。< / p>
传递nullptr
指针是相关的,如果它适合传递const
引用,但也有可能不传递任何对象(例如const
)。
我不会更改以下任何一种
的约定nullptr
),然后传递包含的对象。