关于传递对象的 C++ 约定(指针与引用)

标签 c++ pointers reference conventions

我想制定将参数传递给函数/方法的约定。我知道这是一个常见的问题,并且已经回答了很多次,但是我搜索了很多,没有找到任何让我完全满意的东西。

值传递很明显,我就不提了。我想到的是:

  1. 通过非常量引用 意味着该对象是MODIFIED
  2. 通过const 引用 意味着该对象是USED
  3. 通过指针 传递意味着对对象的引用将被存储。是否传递所有权取决于上下文。

它似乎是一致的,但是当我想选择堆分配的对象并将其传递给 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/

相关文章:

c++ - 如何在开放源IDE(codelite)中迁移到C++ 11

c++ - 施工期间的虚拟功能解决方法

c - 在这个 C 谜题中要替换什么?

c - 为什么 char* 可以在 C 中保存单个 char?

reference - Visual Studio 11 提示 web.config 中的一个命名空间导入

reference - 进程如何引用不在其地址空间中的对象(例如文件或另一个进程)?

c++ - FILE_FLAG_DELETE_ON_CLOSE 和内存映射文件

c++ - C/C++ 指针是保持绝对内存地址,还是相对于应用程序或相对于模块?

C++ 指针设置为地址,但在程序的不同部分莫名其妙地指向不同的值

c++ - 如何隐藏类的私有(private)成员?